아래의 테스트 코드에서 롤백되는 에러가 발생하였습니다.

 

public class JpaTest {

    @Test
    void JpaTest() {
        // 엔티티 팩토리 생성
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("5xik");
        // 엔티티 매니저 생성
        EntityManager em = emf.createEntityManager();
        // 트랜잭션 객체 생성
        EntityTransaction tx = em.getTransaction();
        tx.begin();

        try{
            MemberTest member = new MemberTest();
            member.setId(1L);
            member.setName("parksung");
            member.setPhoneNumber("01074724537");

            em.persist(member);

            Member findMember = em.find(Member.class, 1L);

            System.out.println("findMember,Id = " + findMember.getId());
            System.out.println("findMember.Name = " + findMember.getName());
            tx.commit();
        } catch(Exception e){
            tx.rollback();
        } finally{
            em.close();
        }
        em.close();
    }

    @Entity
    class MemberTest{
        @Id
        @Setter
        @Getter
        private Long id;

        @Setter
        @Getter
        private String name;

        @Setter
        @Getter
        private String PhoneNumber;
    }
}

 

 

해결 시도 1.

 원래 이미 정의되어 있는 Member class 에서 불러오고 있었습니다.

 거기서 엔티티 Id에 대해서 아래와 같이 정의되어 있었습니다.

@Id @GeneratedValue(strategy = GenerationType.IDENTITY)

 

 

Id 값을 자동으로 생성해주는 옵션인데,

setId (1L) 를 해주고 있으니 문제가 발생하나? 라는 생각을 했습니다.

그래서 멤버테스트 클래스를 만들어 해당 클래스에 대한 객체를 만들도록 하였습니다.

하지만 이렇게 해도 해결되지 않았습니다.

 

 

 

 

해결 시도 2.

em.persist(member);

영속성 컨텍스트에 저장할 때 문제가 발생한다고 합니다.

그러면 왜 이때 문제가 발생할까요 ??

에러 로그를 따라가보겠습니다. 

 

at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.markRollbackOnly(JdbcResourceLocalTransactionCoordinatorImpl.java:324)

@Override
public TransactionStatus getStatus() {
	return rollbackOnly ? TransactionStatus.MARKED_ROLLBACK : jdbcResourceTransaction.getStatus();
}

@Override
public void markRollbackOnly() {
	if ( getStatus() != TransactionStatus.ROLLED_BACK ) {
		if ( log.isDebugEnabled() ) {
			log.debug(
					"JDBC transaction marked for rollback-only (exception provided for stack trace)",
			new Exception( "exception just for purpose of providing stack trace" )
			);
		}
		rollbackOnly = true;
	}
}

 

MARKED_ROLLBACK : Commit이 실패할 때 나는 오류입니다.

 

그러면 테스트 코드가 아닌 메인 메소드에서 실행해서 확인해보겠습니다.

java.lang.IllegalArgumentException: Unknown entity: xik.ShoppingMall.Domain.Member

Entity를 못찾고 있는것으로 보입니다.

 

 

 

[ Entity 위치를 못찾는 해결방법 ]

 

persistence.xml 파일에 엔티티가 위치하는 코드를 추가적으로 입력해줍니다.

이때, 테스트 코드에 임시로 적어놓은 클래스 파일을 지우고 원래 엔티티 클래스에 대한 엔티티의 경로를 설정하였습니다.

<class>xik.ShoppingMall.Domain.Member</class>

에러 없이 정상 출력됨을 확인할 수 있습니다.

 

 

 

'JPA(MySQL,H2Database)' 카테고리의 다른 글

임베디드 값 타입  (0) 2022.08.08
SQL 내장함수  (0) 2022.08.05
JPQL 와 JPQL의 테스트 코드 작성  (0) 2022.07.29
EntityManager  (0) 2022.07.29
연관 관계 매핑  (0) 2022.07.15

+ Recent posts