Hibernate学习之一对一关联
一对一关联包括两种类型:
1.主键关联
2.惟一外键关联
主键关联:
两张关联表通过主键形成一对一映射关系
实例:一个公民对应一个身份证

1.主键关联
实体类
TUser .java
><!-- 主键关联 --> <hibernate-mapping><class name="com.model.TUser" table="t_user" dynamic-update="true"><idname="id" type="java.lang.Integer" column="id" unsaved-value="0"><generator class="native" /></id><property name="name" column="name" type="string"/><property name="age" column="age" type="java.lang.Integer"/><one-to-one name="passport" class="com.model.TPassport" cascade="all" outer-join="false"/></class></hibernate-mapping>Tpassport.hbm.xml
><!-- 主键关联 --> <hibernate-mapping><class name="com.model.TPassport" table="t_passport" dynamic-update="true"><idname="id" type="java.lang.Integer" column="id" unsaved-value="0"><!-- 由于采用了主键关联方式,那么通过主键关联的两张表,其关联记录的主键值必须保持同步。 这也就意味着,我们只需为一张表设定主键生成策略,而另一张表的主键与之共享相同的主键值 通过“foreign”类型的主键生成策略与外键共享主键值 --><generator class="foreign"><param name="property">user</param></generator></id><property name="serial" column="serial" type="string"/><property name="expiry" column="expiry" type="java.lang.Integer"/><!-- constrained必须是“true”,以告知hibernate当前表主键上存在一个约束:t_passport表引用了t_user表的主键 --><one-to-one name="user" class="com.model.TUser" constrained="true"/></class></hibernate-mapping>测试代码(部分)
2.惟一外键关联
?实体类
TGroup.java
><hibernate-mapping><class name="com.model.TGroup" table="t_group" dynamic-update="true"><idname="id" type="java.lang.Integer" column="id" unsaved-value="0"><generator class="native" /></id><property name="name" column="name" type="string"/><one-to-one name="user" class="com.model.TUser2" property-ref="group"/></class></hibernate-mapping>Tuser2.hbm.xml
><hibernate-mapping><class name="com.model.TUser2" table="t_user2" dynamic-update="true"><idname="id" type="java.lang.Integer" column="id" unsaved-value="0"><generator class="native" /></id><property name="name" column="name" type="string"/><property name="age" column="age" type="java.lang.Integer"/><!-- 惟一外键关联的一对一关系只是多对一关系的一个特例而已 --><many-to-one name="group" class="com.model.TGroup" column="group_id" unique="true"/></class></hibernate-mapping>测试代码(部分)
public void testSave2(){TGroup group=new TGroup();group.setName("group-one");TUser2 user=new TUser2();user.setName("lisi");user.setAge(20);user.setGroup(group);try {Transaction tx=session.beginTransaction();session.save(user);session.save(group); //必须保存 但先后顺序不要求tx.commit();} catch (HibernateException e) {e.printStackTrace();}}//单向 user---->grouppublic void testLoad3(){try {TUser2 user=(TUser2) session.load(TUser2.class, 1);System.out.println("group name--->"+user.getGroup().getName());} catch (HibernateException e) {e.printStackTrace();}}//双向 group-->userpublic void testLoad4(){/** * 在TGroup.cfg.xml中不添加one-to-one配置时,查不到user信息 * Hibernate: select tgroup0_.id as id0_, tgroup0_.name as name0_ from t_group tgroup0_ where tgroup0_.id=? Group name---->group-one */try {TGroup group=(TGroup) session.load(TGroup.class, 1);System.out.println("Group name---->"+group.getName());System.out.println("group user---->"+group.getUser().getName());} catch (HibernateException e) {e.printStackTrace();}/** 添加配置后 * Hibernate: select tgroup0_.id as id1_, tgroup0_.name as name1_, tuser21_.id as id0_, tuser21_.name as name0_, tuser21_.age as age0_, tuser21_.group_id as group_id0_ from t_group tgroup0_ left outer join t_user2 tuser21_ on tgroup0_.id=tuser21_.group_id where tgroup0_.id=?Hibernate: select tuser20_.id as id1_, tuser20_.name as name1_, tuser20_.age as age1_, tuser20_.group_id as group_id1_, tgroup1_.id as id0_, tgroup1_.name as name0_ from t_user2 tuser20_ left outer join t_group tgroup1_ on tuser20_.group_id=tgroup1_.id where tuser20_.group_id=?Group name---->group-onegroup user---->lisi */}?