2012-02-06 3 views
0

I이 (세터와 게터와 같은 관련이없는/명백한 코드를 무시하고) 다음 모델 :@OneToMany 관계 복합 키

@Entity 
public class Invoice { 
    @Id // sequence generated 
    private Long invoiceId; 

    @OneToMany(fetch = FetchType.EAGER) 
    @JoinColumn(name = "invoiceId", referencedColumnName = "invoiceId") 
    @OrderBy("id.itemNumber") 
    List<Item> items = new ArrayList<Item>(); 
} 


@Entity 
public class Item { 
    @EmbeddedId 
    private ItemPK id; 
} 


@Embeddable 
public class ItemPK { 
    private Long invoiceId; 
    private Long itemNumber; 
} 

가 기존 DB가의 한, DB 구조를 변경할 수 없습니다 :(

itemNumber는 기본적으로 0에서 시작하는 인덱스입니다.

나는 기존의 송장을 그냥 기존 항목을 제거하고 목록에 2 개 개의 새로운 항목을 추가 할 경우, 나는 모든으로 실행 송장 개체를 업데이트 할 때 문제의 종류 :

나는 ItemPK 널 (null)을두면 16,

, 내가 얻을 : org.hibernate.TransientObjectException : 객체가 저장되지 않은 과도 인스턴스 - 나는 ItemPK의 값을 입력하려고하면

를 병합하기 전에 transient 인스턴스를 저장 (ID와 인보이스 ID)을 얻었을 때 org.hibernate.NonUniqueObjectException : 동일한 식별자 값을 가진 다른 객체가 이미 세션과 연결되어 있음 (이미 인보이스 항목이 DB에 있고 새 항목 목록의 첫 번째 개체와 마찬가지로 인보이스 ID와 색인 = 0을가집니다. 내가합니다 (ItemPK 개체)를 invoiceId 널 (null)을 떠나려고하면

, 내가 얻을 : java.sql.BatchUpdateException을 : ORA-01400가 :에 NULL을 삽입 할 수 없습니다

("항목" "invoiceId을".)

Hibernate/JPA가 이것을 처리하도록 할 여지가 있습니까? 또는 연관을 완전히 제거하고 목록을 @Transient로 정의한 다음 채우고 내 서비스 클래스에 저장해야합니까?

감사합니다.

답변

1

Item 엔티티의 invoiceId가 실제로 Invoice의 외래 키이기 때문에 여기에는 양방향 연관이 유효합니다. 따라서 연결을 양방향 연결로 매핑하고 @MapsId 주석을 사용해야합니다. Javadoc에는 예제가 있습니다.

+0

나는 비슷한 문제가있어 이것을 사용하려고 노력했지만 작동하지 못했습니다 : http://stackoverflow.com/questions/31600142/how-to-define-onetomany-in-parent-entity-when- 어린이 복합 레크 리 에이션 – amphibient