一、n:1实体关系映射
1、实体:
<span style="font-size:18px;">public class User1 {
private int id;
private String name;
private Group group;
{
public class Group {
private int id;
private String name;
{</span>
2、配置<span style="font-size:18px;"><!--user为多的一端,在userxml中加入manytoone引入group-->
<class name="com.bjpowernode.hibernate.User1">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="group" column="groupid" cascade="save-update"></many-to-one>
</class>
<class name="com.bjpowernode.hibernate.Group" table="t_group">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class></span>
3、测试<span style="font-size:18px;"> User1 user= (User1)session.load(User1.class, 4);
System.out.println(user.getGroup().getName());</span>
总结:n:1的实体关联创建时,在多的一端加入外键,指向1的一端,具体是通过在实体中注入Group group的属性,配置文件中加入<many-to-one>标签,name指向user中group属性名,column对应t_user表中外键groupid,从而实现了通过user中groupid外键关联,可查看user所在group信息。
二、1:1主键关联
1、双向
1)、实体
<span style="font-size:18px;"><span style="white-space:pre"> </span>public class Person {
private int id;
private String name;
//在person中有idcard的关联
private Card idCard;
}</span>
<span style="font-size:18px;"> public class Card {
private int id;
private String cardNo;
//双向 有card信息要能加载显示person信息
private Person person;
}</span>
2、配置<span style="font-size:18px;"><hibernate-mapping>
<class name="com.bjpowernode.hibernate.Person" table="t_person">
<id name="id">
<!-- <!-- 采用foreign生成策略,forgeign会取得关联对象的标识 --> -->
<generator class="foreign">
<param name="property">idCard</param>
</generator>
</id>
<property name="name"/>
<!-- 指示默认关系字段,根据对端主键生成自己的主键 constrained生成外键约束语句-->
<one-to-one name="idCard" constrained="true"></one-to-one>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.bjpowernode.hibernate.IdCard" table="t_idCard">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
<one-to-one name="person"/>
</class>
</hibernate-mapping>
</span>
3、测试<span style="font-size:18px;"><span style="white-space:pre"> </span>IdCard idCard = new IdCard();
idCard.setCardNo("1111111111111111");
Person person = new Person();
person.setName("张三");
//建立关联
person.setIdCard(idCard);
//没有抛出TransientObjectException
//是由一对一关联映射的特性决定的,它必须先保存关联对象IdCard
//这样它采用foreign映射策略才能取得关联对象的标识
//也就是它默认了cascade属性
session.save(person);</span>
2、单向
单向于双向不同就在于:只能通过person看idCard,反之则不行。通过Card类中取消对Person类的注入,同时取消card配置中<one-to-one>标签即可。
三、1:1外键关联
1、双向
1)、实体类-同1:1主键关联
2)、配置xml
<span style="font-size:18px;"><class name="com.bjpowernode.hibernate.Person" table="t_person">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="idCard" unique="true"/>
</class>
<class name="com.bjpowernode.hibernate.IdCard" table="t_idCard">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
<one-to-one name="person" property-ref="idCard"/>
</class></span>
2、单向
card类中取消person属性,card.xml普通配置即可。同1:1主键单向