2013-08-13 8 views
2

링크 테이블에 추가 속성이있는 다 대다 관계가 있습니다. 따라서 링크 테이블은 엔터티 클래스로도 표현되며 Composition이라고합니다. Composition의 기본 키는 해당 엔터티에 연결되는 @Embeddable입니다 (예 : 2 @ManyToOne 참고 문헌.JPA @EmbeddedId : 복합 기본 키의 일부를 업데이트하는 방법은 무엇입니까?

사용자가 2 개의 참조 중 하나를 선택할 때 오류가 발생하여 복합 기본 키를 업데이트해야 할 수 있습니다. 그러나 JPA (최대 절전 모드) 작동 방식으로 인해 업데이트 대신 새 행 (삽입)이 생성되고 이전 Composition은 여전히 ​​존재합니다. 결과적으로 업데이트되는 행 대신 새로운 행이 추가됩니다.

옵션 1 :

새로운 하나를 삽입하기 전에 이전 Composition 그냥 삭제 될 수 있지만이 따라 방법이 이전과 새 버전을 모두 필요로 처리 할 것을 요구한다. 더하기 업데이트 된 버전은 실제로 새로운 엔티티이므로 낙관적 인 잠금 기능이 작동하지 않으므로 마지막 업데이트가 항상 성공합니다.

옵션 2 :

네이티브 쿼리. 또한 쿼리는 버전 열을 증가시키고 WHERE 절에 버전을 포함시킵니다. 업데이트 수가 0 (동시 수정 또는 삭제) 일 경우 OptimisticLockException을 던져

더 나은 선택은 무엇입니까? 이 문제에 대한 "일반적인 접근 방식"은 무엇입니까?

답변

2

Composition의 기본 키를 자동 생성되는 UID로 변경하지 않는 이유는 무엇입니까? 그런 다음 사용자는 Composition 엔터티를 삭제/다시 만들지 않고도 조인중인 엔터티에 대한 두 참조를 변경할 수 있습니다. 낙관적 인 잠금이 유지됩니다.

편집 : 예를 들어 :

@Entity 
@Table(name = "COMPOSITION") 
public class Composition { 

    @Id 
    @Column(name = "ID") 
    private Long id; // Auto-generate using preferred method 

    @ManyToOne(fetch = FetchType.LAZY, optional = false) 
    @JoinColumn(.... as appropriate ....) 
    private FirstEntity firstEntity; 

    @ManyToOne(fetch = FetchType.LAZY, optional = false) 
    @JoinColumn(.... as appropriate ....) 
    private SecondEntity secondEntity; 

.... 
+0

당신은 가질 수없는'Id' @와'EmbeddedId' @ 일반 JPA에서 동일한 실체이다. 둘 중 하나입니다. –

+2

@beginner_ 아니요,'@ Id '만 있으면'@ EmbeddedId'가 없습니다 (제 편집 참조). 조인중인 두 엔티티를 참조하는 외래 키는 기본 테이블의 열 2 개뿐입니다. 엔티티들 사이의 연관성을 바꾸는 것은 원래의 자동 생성 값으로 남아있는'Composition' 엔티티/레코드의 기본 키가 아닌 외래 키를 변경하는 것입니다. – DuncanKinnear

+0

감사합니다. 그렇게 명백하다. 더 이상 명확하게 볼 수없는 물건에 너무 깊숙한 전형적인 경우. –