【问题标题】:JPA doesn't t allow entity made of columns from multiple tables?JPA 不允许由多个表中的列组成的实体?
【发布时间】:2012-07-04 05:56:16
【问题描述】:

我知道这毫无意义,因为许多教程都指出您可以使用 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.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 中的第一个错误是 2010 年,我很惊讶它已经存在了两年多,因为这应该是一个基本功能。有一些帖子说 JPA 规范只允许主键进行映射,但是,我从 JPA wikibook 得到以下信息

JPA 允许将多个表分配给一个类。这 @SecondaryTable 和 SecondaryTables 注释或 可以使用元素。默认情况下,@Id 列假定为 在两个表中,以便辅助表的 @Id 列是 表的主键和第一个表的外键。如果 第一个表的 @Id 列的名称不同 @PrimaryKeyJoinColumn 或可用于 定义外键连接条件。

非主键显然没问题。然后我很困惑为什么Hibernate没有解决这个问题,因为它似乎很容易通过join子句实现。

有人知道如何解决这个问题吗?谢谢。

【问题讨论】:

    标签: mysql hibernate jpa


    【解决方案1】:

    我不太了解您的设置。

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

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

    【讨论】:

    • 抱歉没说清楚。我已经编辑了这些东西,实际上我需要集群中的一列,而不是连接到服务器中的整个集群实体。所以我认为 ManyToOne 不适合我
    • @zx_wing:无论如何,我认为这不是一个好主意。如果您需要 Server 中的 ip,请创建一个从相关的 Cluster 获取它的 getter。
    猜你喜欢
    • 2012-07-04
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    相关资源
    最近更新 更多