아래의 테스트 코드에서 롤백되는 에러가 발생하였습니다.
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 |