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(); // 트랜잭션 종료