2013-07-04 50 views
0

我遇到一個問題,我不知道是否可以通過使用hibernate/jpa註釋來解決問題。問題是我有一個組合鍵與我的外鍵複合ID具有相同的列,我想在表上共享同一列。例如:在組合鍵和@ManyToOne之間共享列JoinColumns

@Entity 
class Id { 
    @Id 
    @Column(name = "idPessoa") 
    public Integer idShared; 
} 

@Embeddable 
class APK { 
    @ManyToOne 
    @JoinColumn(name = "idShared") 
    public Id idShared; 
    public String nKey; 
} 

@Entity 
class A { 
    @EmbeddedId 
    public APK id; 
} 

@Embeddable 
class BPK { 
    @ManyToOne 
    @JoinColumn(name = "idShared") 
    public Id idShared; 
    public Integer nCode; 
} 

@Entity 
class B { 
    @EmbeddedId 
    public BPK id; 

    @ManyToOne 
    @JoinColumns({ @JoinColumn(name = "idShared", nullable = false, insertable = false, updatable = false), @JoinColumn(name = "nKey", nullable = false) }) 
    public A a; 
} 

的問題是我如何共享列idShared A和B之間,並用它在@ManyToOne外鍵?

我已經嘗試在名稱idShared中使用@JoinColumns中的@JoinColumn,但我得到一個錯誤,說我需要使用insert = false和update = false,我已經把insertable = false和updateable = false,但是然後我得到另一個錯誤,說我不能混合東西。

我發現了一個可能的解決辦法說使用:

@ManyToOne 
@JoinColumnsOrFormulas(value = { 
@JoinColumnOrFormula(formula = @JoinFormula(value = "idShared", referencedColumnName = "idShared")), 
@JoinColumnOrFormula(column = @JoinColumn(name = "nKey", nullable = false)) }) 
public A a; 

但它給我的錯誤:

Unable to find column with logical name in table A 

看來,它必須找到列的「名稱」屬性有些空白。

需要一些幫助,請!

+0

不能做個像'idshared'有您共享ID另一個類,然後把它加入到BPK和APK? – Angga

+0

實際上,在我當前的代碼中,idShared是另一個類的ForeignKey,並且apk和bpk都將此外鍵指向idShared,但問題是我無法看到如何在創建FK時共享同一列到A內B –

+0

我認爲解決方案是與JoinFormula的事情,但我找不到文件如何工作 –

回答

0

請看看Official Java EE 6 Tutorial about composite primary key。您可以使用@EmbeddedId@Embeddable和/或@IdClass註釋。

例如

// File: APK.java --------------------- 
@Embeddable 
public class APK implements Serializable { 
    public Integer idShared; 
    public String nKey; 
} 

// File: A.java ---------------------  
@Entity 
public class A { 
    @EmbeddedId public APK id; 
} 
+0

我已經使用這個,我只是省略 –