(예외) 중첩된 예외는 org.hibernate.id.IdentifierGenerationException입니다. 이 클래스의 ID는 save()를 호출하기 전에 수동으로 할당되어야 합니다.

개발 환경:

스프링 부트 2.7.9

데이터베이스: H2-2.1.214

JDK: 11.0.18 x64

JPA


DEBUG 23-03-11 00:39:202(http-nio-9090-exec-1) octopus.backend.v1.controller.CodeMController.save(55): - tCodeMDto :: TCodeMDto(pCd=null, pCdNm=null, useYn=null, rmk=null)
DEBUG 23-03-11 00:39:206(http-nio-9090-exec-1) octopus.backend.v1.service.CodeService.save(37): - tCodeMDto :: TCodeMDto(pCd=null, pCdNm=null, useYn=null, rmk=null)
INFO  23-03-11 00:39:211(http-nio-9090-exec-1) octopus.advice.ExceptionAdvice.dataAccessException(67): - (ExceptionAdvice >> dataAccessException) getMessage :: {errCode=-1, errMsg=ids for this class must be manually assigned before calling save(): octopus.entity.TCodeM; nested exception is org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): octopus.entity.TCodeM}
WARN  23-03-11 00:39:215(http-nio-9090-exec-1) org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.logException(208): - Resolved (org.springframework.orm.jpa.JpaSystemException: ids for this class must be manually assigned before calling save(): octopus.entity.TCodeM; nested exception is org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): octopus.entity.TCodeM)

이 클래스의 ID는 save()를 호출하기 전에 수동으로 할당해야 합니다. @id 주석이 달린 생성자에 값을 할당하지 않아 발생하는 오류 보지 않았다.

@id는 pk를 의미하는 주석입니다. pk에 값이 없으면 당연히 잘못된 것입니다.

package octopus.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.annotations.Proxy;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity // jpa entity임을 알립니다.
@Getter // getter를 자동으로 생성합니다.
@Builder // builder를 사용할수 있게 합니다.
@NoArgsConstructor(access = AccessLevel.PROTECTED) // 인자없는 생성자를 자동으로 생성합니다.
@AllArgsConstructor(access = AccessLevel.PROTECTED) // 인자를 모두 갖춘 생성자를 자동으로 생성합니다.
@Table(name = "T_CODE_M")
@JsonIgnoreProperties({ "hibernateLazyInitializer", "handler" }) // Post Entity에서 User와의 관계를 Json으로 변환시 오류 방지를 위한 코드
@Proxy(lazy = false)
public class TCodeM extends BaseEntity {
    private static final long serialVersionUID = 1L;
    
    /**
     * 상위 코드
     */
    @Id // pk
    @Column(nullable = false, unique = true, length = 50)
    private String pCd;
    
    /**
     * 상위 코드명
     */
    @Column(nullable = false, length = 200)
    private String pCdNm;
    
    /**
     * 사용여부
     */
    @Column(nullable = false, length = 1)
    @Builder.Default
    private String useYn = "N";
    
    /**
     * 비고
     */
    @Column(length = 1000)
    private String rmk;
}
TCodeM tCodeM = TCodeM.builder().pCd(tCodeMDto.getPCd()).pCdNm(tCodeMDto.getPCdNm()).useYn(tCodeMDto.getUseYn())
                .rmk(tCodeMDto.getRmk()).build();
        
log.debug("tCodeM :: {}", tCodeM);

@Id가 적용되는 Java 유형

  • 자바 프리미티브
  • 자바 래퍼
  • java.util.날짜
  • java.sql.날짜
  • java.math.BigDecimal
  • java.math.BigInteger


https://ultrakain.gitbooks.io/jpa/content/chapter4/chapter4.6.html

4.6 기본 키 매핑 jpa

ultrakain.gitbooks.io

Similar Posts

  • 집에 산다면 뭔가를 보여줘야 한다

    깨어날 시간이 3일 남았을 때 해결해야 할 개인적인 삶과 관련된 일들이 얼마나 중요합니까? 3일, 난 사실 너그럽다, 내가 밀어낼 수 있기 때문이다. 그래서 평소의 공손함을 제외하고는 하루를 보낸 것 같습니다. 사실, 하루밖에 시간이 없다는 말을 듣는다면 깨어나는 것이 그렇게 큰 문제가 아닐 수도 있습니다. 그날 중요한 것은? 깨어날 시간이 3일 남았다면 당신의 제한된 의식 생활과…

  • 진도 전남 관광, 진도명소 진도항 펑목항

    안녕 이웃! 25번 버스의 여행정보 알림입니다. 오늘날 진도는 가볼만한 곳이다. 진도항을 소개해드리겠습니다 🙂 진도항 펑무항 전라남도 진도군에서 만남 전라남도 진도군 봉모리에 있는 진도항입니다. 지금은 펑무강으로 더 잘 알려져 있죠? 쾌속정을 타고 제주도로 가는 가장 빠른 곳이기도 하다. 이제는 잊기보다 기억해야 할 곳입니다. 펑무강에 가면 이렇게 추모공간이 이어진다. 가슴 아픈 곳이라 엄숙하고 조용한 분위기다. 펑무강 펑무기념관은…

  • 복지대부 유아학비지원제도 당월신청 조기신청 변경 신청방법

    복지로 가는 길-유치원 과외-지원 방법 혜택을 통한 유아과외 신청 방법 유아학비 정부는 유치원에 다니는 아이들을 지원하기 위해 유아학비를 보조합니다. 보육원에서 유치원으로 또는 가정 보육원에서 전학하는 경우 자녀의 수업료를 신청해야 합니다. 2월 9일부터 24일까지 사전등록 기간이 종료되었습니다. 사전등록 기간을 놓친 경우 해당 월에 동일한 방식으로 신청할 수 있습니다. 신청 방법 1. 혜택으로 웹 사이트 또는 혜택으로…

  • 합정역 진청각, 점심은 바비큐 먹자

    포스팅할 때 말하지 않아도 Gen MZ 입장에서 비너스 브랜드를 안다고 말하는 것과 같다. 비너스는 LG전자의 옛 이름이다. 금성. 럭키를 만났을 때가 아직도 기억나는데, 럭키의 L과 금성의 G를 합쳐 LG를 만들고, 백제의 우아한 미소를 닮은 새로운 로고가 등장했다. 그때 미술선생님이 하신 말씀… 비너스 로고를 닮은 비너스 홀은 골든 크라운 로고를 보완하는 웅장한 실내 장식이 있습니다. 다른…

  • CJ ENM 주가예상 목표주가 기업분석정보

    본 기사는 CJ ENM의 주가 전망, 목표주가 및 기업정보를 기재하고 있습니다. 주식에 투자하기 전에 정확한 회사 정보와 주식 상태를 검토하는 것이 중요합니다. CJ ENM 주식의 주요현황과 투자정보를 확인하고 현재의 시장상황을 분석해 보겠습니다. CJ ENM 주가 예측 분석 및 기업 상세 CJ ENM 회사 소개 CJ ENM은 미디어 기업입니다. 대표자는 구창근, 윤상현이며, 설립일은 1994.12.16, 주식상장일은 1999.11.23이다….

  • Excel의 색인 함수 요약

    엑셀 인덱스 기능을 쉽고 빠르게 정리하세요! Excel INDEX 함수(인덱스 함수)한 단어 “위치 정보”보지 않았다. 즉, 중요한 데이터를 쉽고 빠르게 검색하거나 찾을 수 있는 기능입니다! 표현은 다음과 같습니다. =INDEX(참조 범위, 행, 열) 여기서 행은 위쪽과 아래쪽이고 열은 왼쪽과 오른쪽의 셀 번호입니다. 예를 들어 아래 Excel에서 표 3의 TN-011을 조회하려면 다음과 같이 하면 됩니다. 여기서 행과 열을…