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로 정의한 다음 채우고 내 서비스 클래스에 저장해야합니까?
감사합니다.
나는 비슷한 문제가있어 이것을 사용하려고 노력했지만 작동하지 못했습니다 : http://stackoverflow.com/questions/31600142/how-to-define-onetomany-in-parent-entity-when- 어린이 복합 레크 리 에이션 – amphibient