Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql JPA没有';不允许由多个表中的列组成的实体?_Mysql_Hibernate_Jpa - Fatal编程技术网

Mysql JPA没有';不允许由多个表中的列组成的实体?

Mysql JPA没有';不允许由多个表中的列组成的实体?,mysql,hibernate,jpa,Mysql,Hibernate,Jpa,我知道这毫无意义,因为很多教程都说可以使用SecondaryTable注释,但它在hibernate中不起作用。我有这样的模式: @Entity @Table(name="server") @SecondaryTable(name="cluster", pkJoinColumns = { @PrimaryKeyJoinColumn(name = "uuid", referencedColumnName = "cluster_uuid") }) public class Server {

我知道这毫无意义,因为很多教程都说可以使用SecondaryTable注释,但它在hibernate中不起作用。我有这样的模式:

@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,获得从集群获取ip列的服务器实体。

然后我遇到了一个hibernate异常:

原因: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没有解决这个问题,因为它似乎很容易通过join子句实现


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

我不太了解您的设置

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

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

我不太明白你的设置

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

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

对不起,我没说清楚。我已经编辑了这些东西,实际上我需要集群中的一列,而不是连接到服务器中的整个集群实体。所以我认为很多人不会为你工作me@zx_wing当前位置无论如何,我认为这不是一个好主意。如果您需要
服务器的
ip
,请创建一个getter,该getter将从相关的
集群
获取它。对不起,我没有说清楚。我已经编辑了这些东西,实际上我需要集群中的一列,而不是连接到服务器中的整个集群实体。所以我认为很多人不会为你工作me@zx_wing当前位置无论如何,我认为这不是一个好主意。如果需要
服务器的
ip
,请创建一个getter,该getter将从相关的
集群中获取它。