我知道這是沒有意義的,因爲很多教程都聲明可以使用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沒有解決這個問題,因爲它似乎很容易通過連接子句來實現。
有人知道如何解決這個問題嗎?謝謝。
對不起,我沒有說清楚。我已經編輯了這些東西,實際上我需要一個來自羣集的列,而不是在Server中連接的整個Cluster實體。所以我認爲ManyToOne不會爲我工作 –
@zx_wing:無論如何,我認爲這不是一個好主意。如果你需要'服務器'的'ip',創建一個可以從相關的'Cluster'中獲取的getter。 – axtavt