**两个对象之间是一对一的关系,如Person-IdCard(人-身份证号)
**有两种策略可以实现一对一的关联映射
查询数据库,有对应的表和数据,则测试通过!
**有两种策略可以实现一对一的关联映射
》主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应关系;
数据库不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联。
》唯一外键关联:外键关联本来是用于多对一的配置,但是如果加上唯一的限制之后,也可以用来表示一对一关联映射。
主键关联映射(单向)
实例场景:
人-->身份证号(Person-->IdCard),从IdCard看不到Person对象
主键关联: 关系模型如下:
对象模型:
IdCard实体类:
public class IdCard implements <span style="color:#ff0000;">java.io.Serializable</span>{
<span style="color:#ff0000;">private static final long serialVersionUID = 1L;</span>
private Integer id;
private Date validateDte;
private Person person;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Date getValidateDte() {
return validateDte;
}
public void setValidateDte(Date validateDte) {
this.validateDte = validateDte;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
}
Person实体类:
public class Person <span style="color:#ff0000;">implements java.io.Serializable</span>{
<span style="color:#ff0000;">private static final long serialVersionUID = 1L;</span>
private Integer id;
private String name;
private IdCard idCard;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public IdCard getIdCard() {
return idCard;
}
public void setIdCard(IdCard idCard) {
this.idCard = idCard;
}
}
IdCard实体映射文件 IdCard.hbm.xml:
<hibernate-mapping package="com.hl.domain">
<class name="IdCard">
<id name="id" type="java.lang.Integer">
<generator class="foreign">
<param name="property">person</param>
</generator>
</id>
<!-- <id name="id" type="java.lang.Integer">
<generator class="assigned"/>
</id>-->
<property name="validateDte" type="java.util.Date">
<column name="validateDte" length="128"/>
</property>
<many-to-one name="person" update="true"/>
</class>
</hibernate-mapping>
Person实体映射文件 Person.hbm.xml:
<hibernate-mapping>
<class name="com.cn.hibernate.Person" table="t_person">
<id name="id" column="id">
<!--
因为主键不是自己生成的,而是作为一个外键(来源于其它值),所以使用foreign生成策略
foreign:使用另外一个相关联的对象的标识符,通常和<one-to-one>联合起来使用。
再使用元素<param>的属性值指定相关联对象(这里Person相关联的对象为idCard,则标识符为idCard的id)为了能够在加载person数据同时加载IdCard数据,所以需要使用一个标签<one-to-one>来设置这个功能。
-->
<generator class="foreign">
<!-- 元素<param>属性name的值是固定为property -->
<param name="property">idCard</param>
</generator>
</id>
<property name="name"/>
<!-- <one-to-one>标签
表示如何加载它的引用对象(这里引用对象就指idCard这里的name值是idCard),同时也说是一对一的关系。
默认方式是根据主键加载(把person中的主键取出再到IdCard中来取相关IdCard数据。)
我们也说过此主键也作为一个外键引用 了IdCard,所以需要加一个数据库限制(外键约束)constrained="true"
-->
<one-to-one name="idCard" constrained="true"/>
</class>
</hibernate-mapping>
配置hibernate.cfg.xml文件
<pre name="code" class="html" style="color: rgb(51, 51, 51);"><session-factory>
<property name="dialect">数据库</property>
<property name="connection.url">url地址</property>
<span style="color: rgb(51, 51, 51); white-space: pre;"> </span><span style="color:#333333;"><property name="connection.username">用户名</property>
<property name="connection.password">密码</property>
</span><span style="color:#ff0000;"><property name="hbm2ddl.auto">update</property></span><span style="color:#333333;">
<property name="show_sql">true</property>
</span><span style="color:#ff0000;"><mapping resource="com/hl/domain/Person.hbm.xml"/>
<mapping resource="com/hl/domain/IdCard.hbm.xml"/></span><span style="color:#333333;">
</session-factory></span></span>
测试:
<pre name="code" class="java">public static void main(String[] args) {
//添加一组Person/idcard
Session s=null;
Transaction tx=null;
try {
//我们使用基础模板来讲解.
s=HibernateUtil.getCurrentSession();
tx=s.beginTransaction();
Person p1=new Person();
p1.setId(1234);
p1.setName("顺平");
IdCard idCard=new IdCard();
idCard.setId(1900);
idCard.setValidateDte(new Date());
idCard.setPerson(p1);//表示idCard对象是属于p1这个对象.
s.save(p1);//先保存人
s.save(idCard);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
if(tx!=null){
tx.rollback();
}
}finally{
if(s!=null && s.isOpen()){
s.close();
}
}
}
}
查询数据库,有对应的表和数据,则测试通过!