ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JpaSystemException
    개발 일지 2024. 6. 27. 02:05

    부트캠프 팀원들과 사이드 프로젝트를 진행하면서 멤버 도메인쪽에서 익명 사용자를 저장하기 위한 로직을 작성하던 중 아래와 같은 오류를 만났다.

     

    Request processing failed: org.springframework.orm.jpa.JpaSystemException: Identifier of entity 'com.jeongseok.ormistackoverflowmember.member.infrastructure.MemberEntity' must be manually assigned before calling 'persist()’

     

    이 오류 지금 멤버 테이블에 pk값을 DB에 위임해서 생성하는 방식으로 만들었는데 애플리케이션이 시작하는 시점에 pk가 null인 상태로 시작되기 때문에 오류가 발생했다. 문제를 해결하기 위해 다시 내 소스를 자세히 봤다.

     

    내가 구현하려던 것은 클라이언트가 서버에 최초 요청을 보낼때 필터에서 사용자를 구분지을 수 있는 별도의 UUID를 생성한 뒤 데이터베이스에 pk 값으로 저장하는 로직을 작성하고 있었다.

    @Table(name = "members")
    public class MemberEntity {
    
    	@Id
    	@GeneratedValue(strategy = GenerationType.IDENTITY)
    	@Column(name = "member_id")
    	private Long id;
    
    	@Column(name = "session_id")
    	private String sessionId;
    	private String id;
    
    	@Enumerated(EnumType.STRING)
    	@Column(name = "role")
    	private RoleType role;
    

     

     

    해당 엔티티를 자세보니 pk값을 DB에 위임하게끔 작성해놓은 것이다. 습관적으로 pk값을 저렇게 설정하다보니 이런 문제가 발생했다.

    결국 다음과 같이 수정한 후 UUID 값이 저장될 수 있도록 만들었다.

    @Entity
    @Getter
    @Setter
    @Table(name = "members")
    public class MemberEntity {
    
    	@Id
    	@Column(name = "member_id")
    	private String id;
    
    	@Enumerated(EnumType.STRING)
    	@Column(name = "role")
    	private RoleType role;
    
    	@OneToOne(mappedBy = "memberEntity", fetch = FetchType.LAZY)
    	private StaffEntity staffEntity;
    
    	public void updateRole(RoleType role) {
    		this.role = role;
    	}
    }
    
Designed by Tistory.