2014-10-20 2 views
0

JPA 2.1에 엔티티를 저장하려고합니다. MVCollection, MVCollectionVersion (MVCollection 버전) 및 MVBelongsCollection (버전에 속하는 항목)의 세 테이블이 있습니다. MVCollection의 기본 키는 생성 된 시퀀스 번호입니다. 버전이있는 항목을 제외한 모음을 생성 할 때 @MapsId를 사용하고 생성 된 ID가 하위 항목 내에서 사용됩니다. 그러나 나는이 항목을 어떻게 복제 할 수 있는지 이해할 수 없다.JPA 그랜드 자식을위한 JPA Hibernate MapsId

여기에 지금까지의 코드에서 조각입니다

@Entity 
public class MVCollection { 

    @GeneratedValue(strategy = GenerationType.SEQUENCE, 
     generator = "MVCOLLECTION_SEQ") 
    @SequenceGenerator(name = "MVCOLLECTION_SEQ", 
     sequenceName = "VMD.MVCOLLECTION_SEQ") 
    @Id 
    @Column(name = "MVCOLLECTIONID") 
    private Long id; 

MVCollectionVersion

@Entity 
public class MVCollectionVersion { 
    @EmbeddedId 
    @AttributeOverrides({ 
     @AttributeOverride(name = "versionId", column = @Column(name = "MVCVSNID")) }) 

    private MVCollectionVersionId id; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumns({ 
     @JoinColumn(name = "MVCOLLECTIONID", referencedColumnName = "MVCOLLECTIONID"), 
    }) 
    @MapsId("mvCollectionId") 
    private MVCollection mvCollection; 

    @OneToMany(fetch = FetchType.LAZY, mappedBy="mvCollectionVersion", cascade={CascadeType.MERGE, CascadeType.PERSIST}) 
    private List<MVBelongsCollection> mvCollectionItems; 

MVCollectionId

@Embeddable 
public class MVCollectionVersionId implements java.io.Serializable { 

/** 
* 
*/ 
    private static final long serialVersionUID = 2551937096790427792L; 
    private Long mvCollectionId; 
    private Integer versionId; 

MVBelongsCollection

@Entity 
public class MVCollectionItems 

    @EmbeddedId 
    @AttributeOverrides({ 
     @AttributeOverride(name = "managedViewId", column = @Column(name = "MANAGEDVIEWID")), 
     @AttributeOverride(name = "mvCollectionId", column = @Column(name = "MVCOLLECTIONID")), 
     @AttributeOverride(name = "versionId", column = @Column(name = "MVCVSNID")) }) 

    private MVBelongsCollectionId id; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumns({ 
     @JoinColumn(name = "MVCOLLECTIONID", referencedColumnName = "MVCOLLECTIONID"), 
     @JoinColumn(name = "MVCVSNID", referencedColumnName = "MVCVSNID") }) 
    private MVCollectionVersion mvCollectionVersion; 
(에 NULL을 삽입 할 수 없습니다 : 그것은 mvCollectionId 필드가 null "ORA-01400 인 상태로
@Embeddable 
public class MVBelongsCollectionId implements Serializable{ 


/** 
* 
*/ 
    private static final long serialVersionUID = 1L; 

    @Column (name = "MANAGEDVIEWID", nullable = false, precision = 38) 
    private Long managedViewId; 

    @Column (name = "MVCOLLECTIONID", nullable = false, precision = 38) 
    private Long mvCollectionId; 

    @Column (name = "MVCVSNID", nullable = false, precision = 38) 
    private Integer versionId; 

나는 버전과 belongsCollection의 항목 컬렉션을 만들려고하면

이 (가) 작성

마지막 MVBelongsCollectionId 실패 "VMD". "MVBELONGSCOLLECTION". "MVCOLLECTIONID") " 따라서 MVCollectionVersion으로 수행 한 것처럼 @MapsId를 추가하려고했습니다. org.hibernate.MappingException : 그러나 Eclipse에서

public class MVBelongsCollection { 

/** 
* primary key 
*/ 
    @EmbeddedId 
    @AttributeOverrides({ 
     @AttributeOverride(name = "managedViewId", column = @Column(name = "MANAGEDVIEWID")), 
     //@AttributeOverride(name = "mvCollectionId", column = @Column(name = "MVCOLLECTIONID")), 
     @AttributeOverride(name = "versionId", column = @Column(name = "MVCVSNID")) }) 
    private MVBelongsCollectionId id; 


/** 
* collection that this joins to. 
*/ 
    @ManyToOne(fetch = FetchType.LAZY) 
    @MapsId("mvCollectionId") 
    @JoinColumns({ 
     @JoinColumn(name = "MVCOLLECTIONID", referencedColumnName = "MVCOLLECTIONID"), 
     @JoinColumn(name = "MVCVSNID", referencedColumnName = "MVCVSNID") }) 
    private MVCollectionVersion mvCollectionVersion; 

이 나는 ​​과정을 시작하면, 나는에 의한 을 얻을

The type of the ID mapped by the relationship 'mvCollectionVersion' does not agree with the primary key class of the target entity. 

의 @ManyToOne 주석에 오류가 표시 매핑 반복 열을 엔티티에 대한 : MVBelongsCollection 열 : MVCVSNID

내 @JoinColumn, @AttributeOVerride 및 근본적인 위치에 insertable = false 및 updatable = false를 추가하려고했습니다. ID 클래스이지만 st 병이 같은 오류가 발생합니다. @MapsId가있는 경우에만 발생합니다.

MVBolongsCollection에서 생성 된 MVCollectionId를 사용하는 방법이 손실되었거나 Eclipse와 런타임 오류를 모두 멈출 수있는 방법을 알고 있습니다.

누구든지 도와 주시면 감사하겠습니다. 나는 내 방식의 오류를 발견 사전

답변

1

에 덕분에 ...

나는 내내 같은 embeddedId를 사용하는 데 필요한. 따라서 MVBelongsCollectionId는 부모 클래스의 임베드 된 ID를 포함하도록 변경해야합니다.

@Embeddable 
public class MVBelongsCollectionId implements Serializable{ 


    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    @Embedded 
    @AttributeOverrides({ 
     @AttributeOverride(name = "mvCollectionId", column = @Column(name = "MVCOLLECTIONID", nullable = false, precision = 38, scale = 0)), 
     @AttributeOverride(name = "versionId", column = @Column(name = "MVCVSNID", nullable = false, precision = 8, scale = 0)) 

    }) 
    MVCollectionVersionId collectionVersionId; 

    @Column (name = "MANAGEDVIEWID", nullable = false, precision = 38) 
    private Long managedViewId; 

    ....