Hibernate:如何用其中一个没有ID的两个表联接?

wu3053

我的两个表(在SQL Server中):

create table cluster (
    id bigint primary key identity(1,1),
    name varchar(100)
)

create table cluster_member (
    cluster_id bigint,
    member_name varchar(100)
)

表cluster_member没有ID。列cluster_id类似于外键,引用了群集表中的id列。

我使用了Hiberate Tools来生成2个@Entity类和一个@Embeddable类。我添加了一些类变量以及@OneToMany和@ManyToOne批注,试图将两个表连接在一起。但我收到一个错误消息:

org.hibernate.MappingException: Foreign key (FK_hk6sas3oycvcljwbjar7p9ky3:cluster_member [cluster_id,member_name])) must have same number of columns as the referenced primary key (cluster [id])

错误消息很清楚。但是我不知道如何解决它。请帮忙。

这是我的代码:

Cluster.java

@Entity
@Table(name = "cluster" )
public class Cluster implements java.io.Serializable {

    private long id;
    private String name;
    private Set<ClusterMember> members;

    @Id
    @Column(name = "id", unique = true, nullable = false)
    public long getId() {
            return this.id;
    }

    @Column(name = "name", length = 100)
    public String getName() {
            return this.name;
    }

    @OneToMany(mappedBy = "id")
    public Set<ClusterMember> getMembers() {
            return members;
    }
}

ClusterMember.java

@Entity
@Table(name = "cluster_member" )
public class ClusterMember implements java.io.Serializable {

    private ClusterMemberId id;
    private Cluster cluster;

    @EmbeddedId
    @AttributeOverrides({ @AttributeOverride(name = "clusterId", column = @Column(name = "cluster_id")),
                    @AttributeOverride(name = "memberName", column = @Column(name = "member_name", length = 100)) })
    public ClusterMemberId getId() {
            return this.id;
    }

    @ManyToOne
    @JoinColumn(name = "cluster_id")
    public Cluster getCluster() {
            return cluster;
    }
}

ClusterMemberId.java

@Embeddable
public class ClusterMemberId implements java.io.Serializable {

    private Long clusterId;
    private String memberName;

    @Column(name = "cluster_id")
    public Long getClusterId() {
            return this.clusterId;
    }

    @Column(name = "member_name", length = 100)
    public String getMemberName() {
            return this.memberName;
    }
}

主要功能

    @SuppressWarnings("deprecation")
    public static void main(String[] args) {
            sessionFactory = new Configuration().configure().buildSessionFactory();
            Session session = sessionFactory.getCurrentSession();
            Transaction tx = session.beginTransaction();
            Criteria criteria = session.createCriteria("my.hibernate.table.Cluster");
            criteria.add(Restrictions.like("name", "%ABC%"));
            @SuppressWarnings("unchecked")
            List<Cluster> clusters = criteria.list();
            for (Cluster cluster: clusters) {
                    System.out.println(cluster.toString());
            }
            tx.commit();
            sessionFactory.close();
    }

hibernate.cfg.xml

             <mapping class="my.hibernate.table.Cluster" />
             <mapping class="my.hibernate.table.ClusterMember" />
弗拉德·米哈尔西娅(Vlad Mihalcea)

尝试更改此:

@OneToMany(mappedBy = "id")
public Set<ClusterMember> getMembers() {
        return members;
}

@OneToMany(mappedBy = "cluster")
public Set<ClusterMember> getMembers() {
        return members;
}

并在关联的ManyToOne映射上将insertable / updatable添加为false。

@ManyToOne
@JoinColumn(name = "cluster_id", insertable="false", updatable="false")
public Cluster getCluster() {
        return cluster;
}

因为您不是对ClusterMember.id真正感兴趣,而是对链接回Cluster的FK感兴趣。

在Hibernate中,不能将同一列用于不同的映射。“ ClusterMember”已经对@Id属性使用了“ cluster_id”,因此,如果您打算用于ManyToOne关联,则需要指示Hibernate忽略对此所做的任何更改(插入和更新应忽略)。

您也可以使用Hibernate的@MapsId批注,用于具有备用关联映射的复合标识符。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何遍历两个列表,其中一个移位?

来自分类Dev

查找两个表,其中一个表具有冗余值

来自分类Dev

如何将一个表中另一个表具有多个ID的两个表联接在一起?

来自分类Dev

查询以从两个表中选择相关数据,其中一个表在第三表中没有相关字段

来自分类Dev

在一个联接中联接两个表

来自分类Dev

如何联接三个表,其中一个表与其他两个表的ID不匹配?

来自分类Dev

Rails:如何创建具有两个“ belongs_to”关系的模型,其中一个始终为空?

来自分类Dev

创建对同一个表的两个外键引用,其中一个具有唯一的复合索引

来自分类Dev

创建具有两个表的视图,其中第二个表没有唯一的ID

来自分类Dev

MYSQL:连接两个表并使用其中一个的随机列

来自分类Dev

如何返回一个MySQL查询,其中联接表中没有计数的行?

来自分类Dev

MySQL对两个表进行联合,其中一个带有时间戳,另一个带有日期

来自分类Dev

在两个表之间进行查询,但还要显示其中一个表中是否没有数据

来自分类Dev

dplyr在一个函数中联接两个表,其中一个变量名是该函数的参数

来自分类Dev

如何使用C#连接两个表,其中一个表包含MongoDB中另一个表的ID列表

来自分类Dev

r如果我有两个具有相同内容的独立组,如何删除其中一个?

来自分类Dev

如何在两个单独的变量上联接两个表,其中一个变量具有相同的名称

来自分类Dev

如何使两个单选按钮成为必需,但仅应接受其中一个

来自分类Dev

找出两个用户之间的联接,但不排除其中一个列不存在的位置

来自分类Dev

如何正常地在两个列上联接两个表,但是如果其中一个列包含null,那么结果必须包含仅与另一列匹配的行?

来自分类Dev

从联接两个表中获得唯一值,其中一个表可能具有特定列的重复值

来自分类Dev

Django有ForeginKey的两个模型,但其中一个未定义

来自分类Dev

如果其中一个具有“ www”,则如何检查两个相同的URL的相等性?

来自分类Dev

MySQL对两个表进行联合,其中一个带有时间戳,另一个带有日期

来自分类Dev

dplyr在一个函数中联接两个表,其中一个变量名是该函数的参数

来自分类Dev

连接两个SQL表,其中一个连接字段被多次使用

来自分类Dev

查询具有不同列但其中一个且之间没有关系的两个表

来自分类Dev

如何比较两个 MySQL 表然后更新其中一个

来自分类Dev

mysql - 如果其中一个具有另一个的外键,如何执行两个连接表的连接?

Related 相关文章

  1. 1

    如何遍历两个列表,其中一个移位?

  2. 2

    查找两个表,其中一个表具有冗余值

  3. 3

    如何将一个表中另一个表具有多个ID的两个表联接在一起?

  4. 4

    查询以从两个表中选择相关数据,其中一个表在第三表中没有相关字段

  5. 5

    在一个联接中联接两个表

  6. 6

    如何联接三个表,其中一个表与其他两个表的ID不匹配?

  7. 7

    Rails:如何创建具有两个“ belongs_to”关系的模型,其中一个始终为空?

  8. 8

    创建对同一个表的两个外键引用,其中一个具有唯一的复合索引

  9. 9

    创建具有两个表的视图,其中第二个表没有唯一的ID

  10. 10

    MYSQL:连接两个表并使用其中一个的随机列

  11. 11

    如何返回一个MySQL查询,其中联接表中没有计数的行?

  12. 12

    MySQL对两个表进行联合,其中一个带有时间戳,另一个带有日期

  13. 13

    在两个表之间进行查询,但还要显示其中一个表中是否没有数据

  14. 14

    dplyr在一个函数中联接两个表,其中一个变量名是该函数的参数

  15. 15

    如何使用C#连接两个表,其中一个表包含MongoDB中另一个表的ID列表

  16. 16

    r如果我有两个具有相同内容的独立组,如何删除其中一个?

  17. 17

    如何在两个单独的变量上联接两个表,其中一个变量具有相同的名称

  18. 18

    如何使两个单选按钮成为必需,但仅应接受其中一个

  19. 19

    找出两个用户之间的联接,但不排除其中一个列不存在的位置

  20. 20

    如何正常地在两个列上联接两个表,但是如果其中一个列包含null,那么结果必须包含仅与另一列匹配的行?

  21. 21

    从联接两个表中获得唯一值,其中一个表可能具有特定列的重复值

  22. 22

    Django有ForeginKey的两个模型,但其中一个未定义

  23. 23

    如果其中一个具有“ www”,则如何检查两个相同的URL的相等性?

  24. 24

    MySQL对两个表进行联合,其中一个带有时间戳,另一个带有日期

  25. 25

    dplyr在一个函数中联接两个表,其中一个变量名是该函数的参数

  26. 26

    连接两个SQL表,其中一个连接字段被多次使用

  27. 27

    查询具有不同列但其中一个且之间没有关系的两个表

  28. 28

    如何比较两个 MySQL 表然后更新其中一个

  29. 29

    mysql - 如果其中一个具有另一个的外键,如何执行两个连接表的连接?

热门标签

归档