2017-08-06 48 views
0

我有一個composite_id_a(ID_1,ID_2,ID_3)class_a,並希望使用composite_id_aclass_b作爲自己composite_id_b的一部分。在另一個組合鍵中使用組合鍵(@MapsId(「id_1,id_2,id_3」))?

class_bcomposite_id_a作爲其主鍵的一部分,也是它的外鍵。

如何映射外鍵在class_b中?

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; 
} 

類B的複合ID:

@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; 
} 

類A的複合ID:

@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<>(); 
} 

我不能使用這樣的事情,如下面的錯誤被拋出:

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; 
} 

B類的複合ID的另一個版本(不工作):

@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) 

回答

1

這是什麼JPA規範稱之爲「衍生身份」。遐想混雜:代碼)你提供,你應該定義你的類略有不同:

@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; 
} 

注意@MapsId註釋上B.aA.bSetOneToMany.mappedBy設置。另外,我相信你所記錄的一個Hibernate錯誤(「在繼承狀態層次結構中找不到聲明類)」是在@Embeddable內部有@EmbeddedId註釋的結果。

在2.4.1節的JPA 2.1規範中討論了衍生身份(帶有示例)。