JPA 연습중에 다음과 같은 에러가 발견되었다.
org.hibernate.id.IdentifierGenerationException: Identifier of entity 'cohttp://m.minod.jpa.domain.inherit.extend.MemberBase' must be manually assigned before calling 'persist()'
Identifier Entity 에러라고 함
테스트 소스는 다음과 같다.
em.persist() 할 때 에러가 나는데 원인이 무엇인지??
@Slf4j @SpringBootTest public class MappedSuperclassTest { // entity 클래스들에 상속시켜서 필드만 추가하게 하는 어노테이션인 @MappedSuperclass 기능 테스트 @PersistenceUnit private EntityManagerFactory emf; @Test void MappedSuperclass_test1(){ // BaseEntity 에 @MappedSuperclass 어노테이션 설정 // BaseEntity에 있는 필드를 추가하길 원하는 EntityClass에 BaseEntity를 extends 상속 시키면 된다고 함. // MemberBase에 상속시켜 테스트 진행 EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); // 트랜잭션 얻어옴. tx.begin(); // 트랜잭션 시작 try { MemberBase member = new MemberBase(); member.setName("이름1"); member.setCreatedBy("생성자 이름1"); member.setCreatedDate(LocalDateTime.now()); em.persist(member); // movie 등록 하나로 item 테이블에 먼저 insert날리고, 그 뒤에 movie table에 insert 또 날린다. member.setLastModifiedBy("수정자1"); member.setLastModifiedDate(LocalDateTime.now()); MemberBase findMember = em.find(MemberBase.class, member.getId()); System.out.println("findMember 조회한것 : "+findMember); tx.commit(); // 트랜잭션 종료 } catch (Exception e) { System.out.println("에러"); tx.rollback(); throw e; } finally { em.close(); } } }
보면 MemberBase 라는 소스는 다음과 같다.
MemberBase 엔티티를 보면 ID 가 자동으로 Identifier 를 설정해주지 않는 엔티티로 되어있어,
persist()로 등록하려면, ID를 setter로 설정해줘야하는데 그부분이 빠져서 나는 에러였다.
@Entity public class MemberBase extends BaseEntity{ @Id @Column(name= "MEMBER_ID") private Long id; private String name; private String city; private String street; private String zipcode; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } public String getZipcode() { return zipcode; } public void setZipcode(String zipcode) { this.zipcode = zipcode; } public void setId(Long id) { this.id = id; } public Long getId() { return id; } }
아래처럼 바꿔주니 성공적으로 insert가 수행되었다.

MemberBase member = new MemberBase(); member.setId(1L); member.setName("이름1"); member.setCreatedBy("생성자 이름1"); member.setCreatedDate(LocalDateTime.now()); em.persist(member); // movie 등록 하나로 item 테이블에 먼저 insert날리고, 그 뒤에 movie table에 insert 또 날린다. member.setLastModifiedBy("수정자1"); member.setLastModifiedDate(LocalDateTime.now()); MemberBase findMember = em.find(MemberBase.class, member.getId()); System.out.println("findMember 조회한것 : "+findMember); tx.commit(); // 트랜잭션 종료