【发布时间】:2014-09-30 04:05:21
【问题描述】:
我的两个表(在 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" />
【问题讨论】:
标签: java sql hibernate jpa join