- 浏览: 120233 次
- 性别:
- 来自: 地球
文章分类
最新评论
-
754731046:
很适合对初学者适用,谢谢
Oracle存储过程详解 -
天明破晓:
我测试了,不好用
Java中的正则表达式验证各种电话号码 -
OracleX:
otom31 写道从来不用标签库,几乎不用struts,除了最 ...
标签库的优点、缺点大辩论 -
otom31:
从来不用标签库,几乎不用struts,除了最早公司要使用以外; ...
标签库的优点、缺点大辩论
一对一关联包括两种类型:
1.主键关联
2.惟一外键关联
主键关联:
两张关联表通过主键形成一对一映射关系
实例:一个公民对应一个身份证
1.主键关联
实体类
TUser .java
/** * 主键关联 * */ public class TUser implements Serializable { private static final long serialVersionUID = -133439792227297972L; private Integer id; private Integer age; private String name; private TPassport passport; .......................... }
TPassport.java
/** * 主键关联 * */ public class TPassport implements Serializable{ private static final long serialVersionUID = -2207892280100301351L; private Integer id; private String serial; private Integer expiry; private TUser user; }
配置文件
Tuser.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" > <!-- 主键关联 --> <hibernate-mapping> <class name="com.model.TUser" table="t_user" dynamic-update="true" > <id name="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
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" > <!-- 主键关联 --> <hibernate-mapping> <class name="com.model.TPassport" table="t_passport" dynamic-update="true" > <id name="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>
测试代码(部分)
//主键关联 public void testSave() { TUser user = new TUser(); user.setName("zhangsan"); user.setAge(20); TPassport passport = new TPassport(); passport.setExpiry(445555); passport.setSerial("PCN2324"); // 设置相互关联 passport.setUser(user); user.setPassport(passport); try { Transaction tx = session.beginTransaction(); // 由于TUser类的one-to-one节点被设置为cascade=all,其关联的passport对象将被级联保存 session.save(user); tx.commit(); } catch (HibernateException e) { e.printStackTrace(); } } //主键关联 public void testLoad1() { try { TUser user = (TUser) session.load(TUser.class, 1); System.out.println("user name---->" + user.getName()); System.out.println("passport serial---->" + user.getPassport().getSerial()); } catch (HibernateException e) { e.printStackTrace(); } /** out-join="true" 加载TUser实例时 hibernate通过left outer join将t_user表及其关联的t_group表同时读出 * Hibernate: select tuser0_.id as id1_, tuser0_.name as name1_, * tuser0_.age as age1_, tpassport1_.id as id0_, tpassport1_.serial as * serial0_, tpassport1_.expiry as expiry0_ from t_user tuser0_ * left outer join * t_passport tpassport1_ on tuser0_.id=tpassport1_.id where tuser0_.id=? */ } //主键关联 public void testLoad2() { try { TUser user = (TUser) session.load(TUser.class, 1); System.out.println("user name---->" + user.getName()); System.out.println("passport serial---->" + user.getPassport().getSerial()); } catch (HibernateException e) { e.printStackTrace(); } /** one-to-one节点设定为 out-join="false"时,分别读取 * Hibernate: select tuser0_.id as id0_, tuser0_.name as name0_, tuser0_.age as age0_ from t_user tuser0_ where tuser0_.id=? * Hibernate: select tpassport0_.id as id1_, tpassport0_.serial as serial1_, tpassport0_.expiry as expiry1_, tuser1_.id as id0_, tuser1_.name as name0_, tuser1_.age as age0_ from t_passport tpassport0_ left outer join t_user tuser1_ on tpassport0_.id=tuser1_.id where tpassport0_.id=? */ }
2.惟一外键关联
实体类
TGroup.java
/** * 惟一外键关联实体 */ public class TGroup implements Serializable { private static final long serialVersionUID = 263676571059714064L; private Integer id; private String name; // 不加实现的是单向一对一关系 通过Tuser2对象可以获得其相对应的Tgroup对象,但不能反过来 // 增加是为了实现双向一对一关系 可以互相获得 并且还要在TGroup.cfg.xml中追加one-to-one配置 private TUser2 user; ............................. }
TUser2.java
/** *惟一外键关联实体 */ public class TUser2 implements Serializable{ private static final long serialVersionUID = -1898408468538505300L; private Integer id; private Integer age; private String name; private TGroup group; .................. }
配置文件
TGroup.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" > <hibernate-mapping> <class name="com.model.TGroup" table="t_group" dynamic-update="true" > <id name="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
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" > <hibernate-mapping> <class name="com.model.TUser2" table="t_user2" dynamic-update="true" > <id name="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---->group public 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-->user public 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-one group user---->lisi */ }
发表评论
-
Hibernate学习之hibernate.cfg.xml配置
2011-08-23 09:22 709<?xml version='1.0' encodi ... -
Hibernate学习之初步使用
2011-08-23 10:47 805package com.test; import j ... -
Hibernate学习之一对多关联
2011-08-23 11:02 743注意事项: 1.单向一对 ... -
Hibernate学习之三种状态及生命周期(图)
2011-08-23 11:36 758三种状态: 生命周期: 代码表示: / ... -
Struts1入门实例(简单登录)
2011-09-19 23:00 871现在开始加入公司的核心项目,但由于项目开发比较早,所以使用的技 ... -
Hibernate学习包
2011-08-23 11:23 688Hibernate基础、一对一、一对多关联,及相应的工具包或j ... -
HIBERNATE关联关系映射
2011-04-25 21:29 6881、单向N-1 2、单向1-1 3、单向1-N 4、 ... -
Hibernate配置详解【转】
2011-04-25 21:22 608表 3.3. Hibernate配置属性 ... -
hibernate.cfg.xml配置总结【转】
2011-04-25 21:19 832Hibernate的描述文件可以是一个properties ... -
Hibernate hbm.xml配置【转】
2011-04-25 21:04 701配置文件的基本结构如下: <?xml vers ... -
Spring与Hibernate集成中的session
2011-04-24 14:42 01.通过getSession()方法获得session操作 ... -
Hibernate主键生成策略【转】
2011-04-24 14:08 715Hibernate主键产生器 可 ... -
Hibernate HQL查询 插入 更新(update)实例 【转】
2011-04-24 14:08 8031、 实体查询: 有关实 ...
相关推荐
Hibernate 一对一外键单向关联 Hibernate 一对一主键单向关联 Hibernate 一对一连接表单向关联 Hibernate 一对多外键单向关联 Hibernate 一对多连接表单向关联 Hibernate 多对一外键单向关联 Hibernate 多对一连接...
Hibernate双向一对一关联映射(注解版)
免积分的资源,希望可以帮到大家,这是我学习hibernate时候,自己写的代码。希望大家学业有成。
hibernate外键实现一对一单向关联关系源码
hibernate主键实现一对一单向关联关系源码
包含《多对多双向关联映射》《多对一单向关联映射》《多对一双向关联映射》《一对多单向关联映射》等文档,并有图解及例子,非常适合新手学习,尤其是刚刚接触hibernate,对映射关系不清楚的。。。。
Hibernate学习要点:一对一主键关联双向
hibernate外键实现一对一双向关联关系源码
Hibernate学习:单向多对一关联 工程
Hibernate一对一,一对多,多对多实例
这里包含了hibernate多对一单向关联关系实现源码,希望对你有用。
Hibernate映射一对多关联关系
demo代码; 博客地址:http://blog.csdn.net/smilefyx/article/details/48951933
hibernate一对一主键关联代码实现
│ ├─ 一对一外键单向关联 │ ├─ 一对一主键单向关联 │ ├─ 一对一连接表单向关联 │ ├─ 一对多外键单向关联 │ ├─ 一对多连接表单向关联 │ ├─ 多对一外键单向关联 │ ├─ 多对一连接表单向关联 │ └...
1、在有外键的一方,可以维护关联关系,可以建立关联关系,同样也可以解除关联关系,可以任意删除本对象,如果在hbm.xml中设置了cascade="delete",也可以删除关联对象 2、在没有外键的一方,不可以维护关联关系,...
博文链接:https://shaqiang32.iteye.com/blog/201308
博文链接:https://llying.iteye.com/blog/220802
hibernate主键一对一关联映射代码示例
该资源包含了一些常用的hibernate关联映射实例。包括一对多,多对多,继承映射,等,是学习hibernate的必备品