Java Hibernate:如何将两个表与其中一个表连接起来&x27;你没有身份证吗?
我的两个表(在SQL Server中): 表cluster_成员没有id。列cluster_id类似于外键,引用集群表中的id列 我使用Hibrate工具生成了2个@Entity类和一个@Embeddeble类。我添加了一些类变量和@OneToMany和@ManyToOne注释,试图连接这两个表。但我有一个错误说: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
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。非常感谢你!