1

我知道这没有任何意义,因为许多教程都指出您可以使用 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 子句实现。

有人知道如何克服这个问题吗?谢谢你。

4

1 回答 1

1

我不太明白你的设置。

@SecondaryTable用于将单个实体存储在多个表中,但在您的情况下,不同实体之间存在多对一关系(每个实体都存储在自己的表中),并且应该这样映射:

@Entity 
@Table(name="server") 
public class Server { 
    @ManyToOne
    @JoinColumn(name = "cluster_uuid")
    private Cluster cluster;
    ...
}
于 2012-07-03T08:05:43.987 回答