《Hibernate学习笔记七》一对一联合主键的关联
前面我们讲解了一对一外键关联和一对一主键的关联,这篇博文介绍下联合主键的关联关系。
先回顾下联合主键,可以参考以前写的这篇博文:http://blog.csdn.net/u010412719/article/details/51275744
联合主键的关联
假设有Husband实体类和Wife实体类,Husband类中的主键为id,而 Wife实体类中的主键由id 和name联合主导。
先看Wife实体类
联合主键的映射这里采用第三种方法:@IdClass类做。其中,主键类WifePK要继承Serialable接口,以及要重写equals、hashCode方法。
代码如下:
@Entity
@IdClass(WifePK.class)
public class Wife {
private int id;
private String name;
private int age;
@Id
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Id
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package com.hibernate.model;
import java.io.Serializable;
public class WifePK implements Serializable{
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int hashCode() {
return this.name.hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof WifePK) {
WifePK pk = (WifePK) obj;
if(this.id==pk.getId()&&this.name.equals(pk.getName())){
return true;
}
}
return false;
}
}
Husband类
在单个主键中,我们一对一采用的注解为:@JoinColumn(name=”wifeId”)
现在wife中有两个主键,应该怎么办呢??
方法如下:
@OneToOne
@JoinColumns(
{
@JoinColumn(name="wifeId",referencedColumnName="id"),
@JoinColumn(name="wifeName",referencedColumnName="name")
}
)
Husband类详细代码如下:
@Entity
public class Husband {
private int id;
private String name;
private Wife wife;
@Id
@GeneratedValue
public int getId() {
return id;
}
@OneToOne
@JoinColumns(
{
@JoinColumn(name="wifeId",referencedColumnName="id"),
@JoinColumn(name="wifeName",referencedColumnName="name")
}
)
public Wife getWife() {
return wife;
}
public void setWife(Wife wife) {
this.wife = wife;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
测试类代码如下:
测试代码中主要借用了SchemaExport来将SQL语句输出到数据库中。
public class Test {
@Test
public void testSchema(){
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();
Metadata metadata = new MetadataSources(serviceRegistry).buildMetadata();
SchemaExport schemaExport = new SchemaExport();
schemaExport.create(EnumSet.of(TargetType.DATABASE), metadata);
}
}
执行结果如下:
从结果可以看出,这样就建立了一个一对一的联合主键之间的关联。
小结
上面主要介绍了一对一联合主键的关联关系的Annotation的实现,而关于.xml文件的实现由于相当繁琐,这里不再进行介绍。