我知道这没有任何意义,因为许多教程都指出您可以使用 SecondaryTable 注释,但是它在休眠中不起作用。我有这样的架构:
@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 列的服务器实体。
然后我遇到了一个休眠异常:
引起:org.hibernate.AnnotationException:SecondaryTable JoinColumn 不能在 org.hibernate.cfg.annotations.EntityBinder.bindJoinToPersistentClass(EntityBinder) 引用 org.hibernate.cfg.annotations.TableBinder.bindFk(TableBinder.java:402) 的非主键.java:620) 在 org.hibernate.cfg.annotations.EntityBinder.createPrimaryColumnsToSecondaryTable(EntityBinder.java:612)
我看到很多人都遇到过这个问题。但是 Hibernate 的 bugzilla 中的第一个错误是 2010 年,我很惊讶它已经存在了两年多,因为这应该是一个基本功能。有一些帖子说 JPA 规范只允许主键进行映射,但是,我从 JPA wikibook 得到以下信息
JPA 允许将多个表分配给单个类。可以使用 @SecondaryTable 和 SecondaryTables 注释或元素。默认情况下,@Id 列假定在两个表中,因此辅助表的 @Id 列是表的主键和第一个表的外键。如果第一个表的@Id 列的名称与@PrimaryKeyJoinColumn 不同,则可以用于定义外键连接条件。
非主键显然没问题。然后我很困惑为什么 Hibernate 没有解决这个问题,因为它似乎很容易通过 join 子句实现。
有人知道如何克服这个问题吗?谢谢你。