hibernate进阶之路之一对一映射(二)
来源:互联网 发布:unity3d 性能测试工具 编辑:程序博客网 时间:2024/06/06 03:01
上篇博客简单介绍了hibernate,并实现了一个基本映射,本篇博客将更加详细介绍映射相关内容。本文介绍一对一映射。一对一关联有两种策略:1、主键和主键关联;2、唯一外键关联,其实是多对一关联,但是把多的一端的外键设置成唯一;
1、主键主键关联:明确需求,创建实体:
一个用户只能有一个身份证号,那么user和idCard就是一对一关联,
首先看主键和主键关联,在user端维护关系,创建两个实体:
user:
public class User{private int id;private String name;private IdCard idCard;//idCard的引用 //省略getter、setter}idCard:
public class IdCard {private int id;private String cardNo; //省略getter、setter}
2、创建实体映射文件(全局配置文件在上篇博客已经介绍到,实体映射文件写好之后,加到全局配置文件的mapping标签中):
idCard.hbm.xml(相对简单):
<?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.tgb.hibernate.IdCard" table="t_idCard"><id name="id"><generator class="native"/></id><property name="cardNo"/></class></hibernate-mapping>User.hbm.xml(维护关系的一端,配置相对复杂):
<?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.tgb.hibernate.User" table="t_user"><id name="id"><!-- foreign表示一对一共享主键,两个id值一样, --><generator class="foreign"><param name="property">idCard</param></generator></id><property name="name"/><!-- constrained=true,则表明存在外键与关联表对应,并且关联表中肯定存在对应的键与其对应 --><one-to-one name="idCard" constrained="true"/></class></hibernate-mapping>
constrained="true",表示User的主键同时是个外键,会生成外键约束语句,这样的单项关联时,如果是false不会使用lazy,会采用left join的方式查出来,true则是延迟加载。而且true的时候save和delete的顺序也是固定的了。save时先增加关联表,delete相反。
如果是双向关联,则需要在idCard的映射文件中,添加<one-to-one/>标签,关联User。
3、生成数据库表:
t_idcard:
t_user:
t_user表中没有外键约束。
4、测试类:
(简写,只写了逻辑代码):
</pre><p><pre name="code" class="java">session.beginTransaction();IdCard idCard = new IdCard();idCard.setCardNo("1304545453453");User user = new Person(); user.setName("张三"); //建立关联user.setIdCard(idCard);session.save(user);session.getTransaction().commit();
这样就在t_user和t_idCard表分别保存了一条记录,而且两个id是一样的。
二、唯一外键关联方法:
单向关联:
User.hbm.xml:
<?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.tgb.hibernate.User" table="t_user"><id name="id"><generator class="native"/></id><property name="name"/><many-to-one name="idCard" unique="true"/></class></hibernate-mapping>注意使用的是many-to-one标签,而且必须使用unique="true"来限制,表示唯一性。
idCard.hbm.xml:
<?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.tgb.hibernate.IdCard" table="t_idCard"><id name="id"><generator class="native"/></id><property name="cardNo"/></class></hibernate-mapping>生成的数据库表(有了外键约束):
t_user:
测试就不再写了,要注意的是重点关注映射文件。
双向关联:
必须在上面的idCard.hbm.xml中添加:<one-to-one name="person" property-ref="idCard"/>
property-ref="idCard"指定了关系字段的名称。
- hibernate进阶之路之一对一映射(二)
- Hibernate进阶之双向一对一关系映射
- 【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)
- 【SSH进阶之路】Hibernate映射——一对一双向关联映射(六)
- 【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)
- 【SSH进阶之路】Hibernate映射——一对一双向关联映射(六)
- 【SSH进阶之路】Hibernate映射——一对一双向关联映射(六)
- 【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)
- 【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)
- 【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)
- 【SSH进阶之路】Hibernate映射——一对一双向关联映射(六)
- Hibernate之一对一映射
- hibernate映射之一对一映射
- 【HIbernate框架学习】:Hibernate对象关系映射之一对一关联映射(二)
- hibernate进阶一对一映射
- Hibernate之一对一关联映射
- Hibernate学习之一对一映射
- Hibernate 一对一映射(二)
- 使用markdown编辑器
- 如何 操作Blob 大对象、映射派生属性 、映射组成关系
- java简单的StringBufferuilder和StringBuilder类练习
- Easy-题目6:283. Move Zeroes
- ping www.baidu.com 不通 开启DNS
- hibernate进阶之路之一对一映射(二)
- AppStore审核被拒--后台定位
- Easy-题目7:100. Same Tree
- [JavaScript] 8.JS BOM对象
- IOS 关于取消延迟执行函数的种种。performSelector与cancelPreviousPerformRequestsWithTarget
- Django 进阶(装饰器,Mixin,信号,模式)
- Android APP的字体设置
- android 6.0sd卡内部存储 & 外部存储
- tomcat+websocket实现