一对一映射分2种映射策略,一个是根据主键一样,另一个是根据外键一样。
注意到:one2one标签,只影响加载,不影响存储。
首先,讲主键。
1.单向一对一。
以Person类和IdCard类为例, 假设需求是根据Person找到IdCard,那么各个类如下:
package com.bjpowernode.hibernate.domain;
public class Person {
private int id;
private String name;
private IdCard idCard;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public IdCard getIdCard() {
return idCard;
}
public void setIdCard(IdCard idCard) {
this.idCard = idCard;
}
}
Person配置文件:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.bjpowernode.hibernate.domain.Person" table="t_person"> <id name="id"> <generator class="foreign"> <param name="property">idCard</param> </generator> </id> <property name="name"/> <one-to-one name="idCard" constrained="true" /> </class> </hibernate-mapping>
IdCard类:
package com.bjpowernode.hibernate.domain;
import java.util.Set;
public class IdCard {
private int id;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
/*public Set getStudents() {
return students;
}
public void setStudents(Set students) {
this.students = students;
}*/
}
IdCard配置文件:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.bjpowernode.hibernate.domain.IdCard" table="t_idcard"> <id name="id"> <generator class="native"/> </id> <property name="name"/> </class> </hibernate-mapping>
-------------------------------------------------------------------------------------------------------------
2.双向一对一,主键策略
只要将IdCard中增加一个属性Person
package com.bjpowernode.hibernate.domain;
public class IdCard {
private int id;
private String name;
private Person person;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
}
IdCard配置文件:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.bjpowernode.hibernate.domain.IdCard" table="t_idcard"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <one-to-one name="person"/> </class> </hibernate-mapping>
至此,一对一双向主键策略完成。