我的两个表(在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" />
尝试更改此:
@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] 删除。
我来说两句