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)