본문 바로가기
  • 오늘도 한걸음. 수고많았어요.^^
  • 조금씩 꾸준히 오래 가자.ㅎ
IT기술/spring

[Spring] JPA 에러must be manually assigned before calling 'persist()' 에러 해결하기

by 미노드 2024. 3. 27.

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