2017-08-06 2 views
0

Ich habe ein composite_id_a (ID_1, ID_2, ID_3) in class_A und willcomposite_id_a in class_B als Teil seines eigenen composite_id_b verwenden.Verwenden Sie den zusammengesetzten Schlüssel in einem anderen zusammengesetzten Schlüssel (@MapsId ("ID_1, ID_2, ID_3"))?

Die class_B hat composite_id_a als Teil ihrer Primärschlüssel und ist auch ihre Fremdschlüssel.

Wie sollte ich den Fremdschlüssel in class_b zuordnen?

class_B:

public class B{ 

@EmbeddedId 
private CompositeId_B composite_id_b; 

// This does not work: I cannot use more properties in @MapsId 
@MapsId("id_1, id_2, id_3") 
@ManyToOne(fetch = FetchType.LAZY, optional = false) 
@JoinColumns({ 
     @JoinColumn(name="ID_1", referencedColumnName="ID_1"), 
     @JoinColumn(name="ID_2", referencedColumnName="ID_2"), 
     @JoinColumn(name="ID_3", referencedColumnName="ID_3")}) 
private A class_a; 
} 

zusammengesetzte ID der Klasse B:

@Embeddable 
public class Id_B{ 

@Column(name = "ID_1") 
private Integer id_1; 

@Column(name = "ID_2") 
private Integer id_2; 

@Column(name = "ID_3") 
private Integer id_3; 

@Column(name = "NAME") 
private String name; 
} 

zusammengesetzte ID der Klasse A:

@Embeddable 
public class Id_A{ 

@Column(name = "ID_1") 
private Integer id_1; 

@Column(name = "ID_2") 
private Integer id_2; 

@Column(name = "ID_3") 
private Integer id_3; 
} 

class_A:

public class A{ 

@EmbeddedId 
private ID_A id_a; 

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) 
@JoinColumns({ 
     @JoinColumn(name="ID_1", referencedColumnName="ID_1"), 
     @JoinColumn(name="ID_2", referencedColumnName="ID_2"), 
     @JoinColumn(name="ID_3", referencedColumnName="ID_3")}) 
private Set<B> b = new HashSet<>(); 
} 

Ich kann nicht so etwas wie diese, wie der folgende Fehler ausgelöst:

public class B{ 

@EmbeddedId 
private CompositeId_B composite_id_b; 

// This does not work: I cannot use more properties in @MapsId 
@MapsId("composite_id_a") 
@ManyToOne(fetch = FetchType.LAZY, optional = false) 
@JoinColumns({ 
     @JoinColumn(name="ID_1", referencedColumnName="ID_1"), 
     @JoinColumn(name="ID_2", referencedColumnName="ID_2"), 
     @JoinColumn(name="ID_3", referencedColumnName="ID_3")}) 
private A class_a; 
} 

eine andere Version von Composite-ID der Klasse B (nicht funktioniert):

@Embeddable 
public class Id_B{ 

@EmbeddedId 
private CompositeId_A composite_id_a; 

@Column(name = "NAME") 
private String name; 
} 


13:55:46,010 ERROR [org.hibernate.annotations.common.AssertionFailure:42] HCANN000002: An assertion failure occurred (this may indicate a bug in Hibernate): org.hibernate.annotations.common.AssertionFailure: Declaring class is not found in the inheritance state hierarchy: entity.CompositeId_B 
    at org.hibernate.cfg.BinderHelper.getMappedSuperclassOrNull(BinderHelper.java:811) 

Antwort

1

Dies ist, was Die JPA-Spezifikation nennt eine "abgeleitete Identität". Spekulieren auf dem Mischmasch:) von Code Ihnen, können Sie Ihre Klassen etwas anders definieren sollte:

@Embeddable 
public class Id_A implements Serializable { 
    @Column(name = "ID_1") 
    private Integer id_1; 

    @Column(name = "ID_2") 
    private Integer id_2; 

    @Column(name = "ID_3") 
    private Integer id_3; 
} 

@Entity 
@Table(name = "A") 
public class A { 
    @EmbeddedId 
    private Id_A id; 

    @OneToMany(mappedBy = "a", cascade = CascadeType.ALL, orphanRemoval = true) 
    private Set<B> bSet = new HashSet<>(); 
} 

@Embeddable 
public class Id_B implements Serializable { 
    Id_A aId; // corresponds to PK type of A 

    String name; 
} 

@Entity 
public class B { 
    @EmbeddedId 
    private Id_B id; 

    @ManyToOne(fetch = FetchType.LAZY, optional = false) 
    @JoinColumns({ 
     @JoinColumn(name="ID_1", referencedColumnName="ID_1"), 
     @JoinColumn(name="ID_2", referencedColumnName="ID_2"), 
     @JoinColumn(name="ID_3", referencedColumnName="ID_3")}) 
    @MapsId("aId") 
    private A a; 
} 

Notiere die @MapsId Anmerkung auf B.a und die OneToMany.mappedBy Einstellung auf A.bSet.

Außerdem glaube ich, dass der eine Hibernate-Fehler, den Sie dokumentieren ("Deklaration der Klasse ist nicht in der Vererbungshierarchie gefunden"), das Ergebnis einer @EmbeddedId Annotation innerhalb einer @Embeddable ist.

Abgeleitete Identitäten werden (mit Beispielen) in der JPA 2.1 Spezifikation in Abschnitt 2.4.1 diskutiert.

Verwandte Themen