Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.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
Java Hibernate:如何将两个表与其中一个表连接起来&x27;你没有身份证吗?_Java_Sql_Hibernate_Jpa_Join - Fatal编程技术网

Java Hibernate:如何将两个表与其中一个表连接起来&x27;你没有身份证吗?

Java Hibernate:如何将两个表与其中一个表连接起来&x27;你没有身份证吗?,java,sql,hibernate,jpa,join,Java,Sql,Hibernate,Jpa,Join,我的两个表(在SQL Server中): 表cluster_成员没有id。列cluster_id类似于外键,引用集群表中的id列 我使用Hibrate工具生成了2个@Entity类和一个@Embeddeble类。我添加了一些类变量和@OneToMany和@ManyToOne注释,试图连接这两个表。但我有一个错误说: org.hibernate.MappingException: Foreign key (FK_hk6sas3oycvcljwbjar7p9ky3:cluster_member [c

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

表cluster_成员没有id。列cluster_id类似于外键,引用集群表中的id列

我使用Hibrate工具生成了2个@Entity类和一个@Embeddeble类。我添加了一些类变量和@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;
    }
}
@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;
    }
}
@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();
    }
ClusterMemberId.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;
    }
}
@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;
    }
}
@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();
    }
主要功能

@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;
    }
}
@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;
    }
}
@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();
    }
@SuppressWarnings(“弃用”)
公共静态void main(字符串[]args){
sessionFactory=新配置().configure().buildSessionFactory();
Session Session=sessionFactory.getCurrentSession();
事务tx=会话.beginTransaction();
Criteria=session.createCriteria(“my.hibernate.table.Cluster”);
添加(限制,如“名称”,“ABC%”);
@抑制警告(“未选中”)
List clusters=criteria.List();
用于(群集:群集){
System.out.println(cluster.toString());
}
tx.commit();
sessionFactory.close();
}
hibernate.cfg.xml

             <mapping class="my.hibernate.table.Cluster" />
             <mapping class="my.hibernate.table.ClusterMember" />

尝试更改此选项:

@OneToMany(mappedBy = "id")
public Set<ClusterMember> getMembers() {
        return members;
}
因为您实际上对ClusterMember.id不感兴趣,而是对FK链接回集群感兴趣

在Hibernate中,不能在中使用同一列进行不同的映射。“ClusterMember”已经将“cluster_id”用于@id属性,因此,如果您计划用于manytone关联,则需要指示Hibernate忽略对此目的的任何更改(插入和更新应忽略)


您还可以将,用于具有备用关联映射的复合标识符。

现在我收到了一个不同的错误:线程“main”org.hibernate.MappingException中的异常:实体映射中的重复列:ClusterMember列:cluster\u id(应使用insert=“false”update=“false”进行映射)我编辑了我的帖子。添加了主函数,我的hibernate.cfg.xml.xml也更新了我的响应。这很有效!一个小小的变化是:它应该是insertable=false,updateable=false。非常感谢你!