2012-07-03 34 views
1

我知道這是沒有意義的,因爲很多教程都聲明可以使用SecondaryTable註釋,但它在休眠中不起作用。我有這樣的架構:JPA不允許由多個表中的列組成實體嗎?

@Entity 
@Table(name="server") 
@SecondaryTable(name="cluster", pkJoinColumns = { @PrimaryKeyJoinColumn(name = "uuid", referencedColumnName = "cluster_uuid") }) 
public class Server { 
    @Id 
    @Column(name = "uuid") 
    private String uuid; 

    @Column(name = "cluster_uuid") 
    private String clusterUuid; 

     @Column(name = "ip", table="cluster") 
     private String ip; 
..... } 

@Entity 
@Table(name = "cluster") 
public class Cluster { 
    @Id 
    @Column(name = "uuid") 
    private String uuid; 

    @Column(name = "ip") 
    private String ip; 

..... 
} 

Server.clusterUuid是Cluster.uuid的外鍵。 我希望通過將Server.clusterUuid加入到Cluster.uuid中來獲取從Cluster獲取IP列的Server實體。

然後我迎了休眠異常:org.hibernate.AnnotationException:

致SecondaryTable JoinColumn不能在org.hibernate.cfg.annotations.TableBinder引用不主鍵 。 bindFk(TableBinder.java:402) 在org.hibernate.cfg.annotations.EntityBinder.bindJoinToPersistentClass(EntityBinder.java:620) 在org.hibernate.cfg.annotations.EntityBinder.createPrimaryColumnsToSecondaryTable(EntityBinder.java:612)

我看到很多人遇到過這個問題。但在Hibernate的bugzilla中,第一個bug是2010年,我很驚訝它已經存在了兩年多了,因爲這應該是一個基本功能。有一些帖子說JPA規範只允許主鍵進行映射,但是,我從JPA獲得以下內容:wikibook

JPA允許將多個表分配給單個類。可以使用 @SecondaryTable和SecondaryTables註釋或 元素。默認情況下,兩個表中的@Id列被假定爲 ,以便次表的@Id列是表的主關鍵字 ,第一個表的外鍵。如果 第一個表的@Id列沒有被命名爲相同的 @PrimaryKeyJoinColumn或可用於 定義外鍵連接條件。

對於非主鍵顯然是可以的。然後我很困惑,爲什麼Hibernate沒有解決這個問題,因爲它似乎很容易通過連接子句來實現。

有人知道如何解決這個問題嗎?謝謝。

回答

1

我不太瞭解你的設置。

@SecondaryTable是存儲在多個表中一個單獨的實體,但在你的情況有不同的實體(每一個存儲在自己的表)之間的多到一的關係,它應該被映射爲這樣的:

@Entity 
@Table(name="server") 
public class Server { 
    @ManyToOne 
    @JoinColumn(name = "cluster_uuid") 
    private Cluster cluster; 
    ... 
} 
+0

對不起,我沒有說清楚。我已經編輯了這些東西,實際上我需要一個來自羣集的列,而不是在Server中連接的整個Cluster實體。所以我認爲ManyToOne不會爲我工作 –

+1

@zx_wing:無論如何,我認爲這不是一個好主意。如果你需要'服務器'的'ip',創建一個可以從相關的'Cluster'中獲取的getter。 – axtavt

相關問題