- 浏览: 18374 次
最新评论
hibernate3.2多对一关联映射
2011年03月01日
多个用户对应一个组,要在用户中体现出多对一,所以用户中要private Group group public class User { private int id;//给实体一个唯一性的标识 private String name; private Group group; getter and setter... }
省略group实体和hbm.xml,注意hbm文件中class标签中要制定table别名,因为默认生成的表group是数据库的关键字,会出错的。
执行测试方法: public void testReference(){ Session session = HibernateUtils.getSession(); try { session.beginTransaction(); Group group = new Group(); group.setName("一起探索"); User user1 =new User(); user1.setName("张三"); user1.setGroup(group); User user2 =new User(); user2.setName("李四"); session.save(group); //不能成功保存 session.save(user1); System.out.println("----------mark1------------"); session.save(user2); System.out.println("----------mark2------------"); //session.save(group); //System.out.println("----------mark3------------" ); session.getTransaction().commit(); } catch (HibernateException e) { e.printStackTrace(); session.getTransaction().rollback(); }finally{ HibernateUtils.closeSession(session); } }
这里会报错:
org.hibernate.TransientObjectException.
原因是:
group为transient状态 ,id我们设定为hibernate帮我们自增,id是在session.save方法后,也就是group状态变为persistent才有id,hibernate才给你自动赋值。这里group的id还没有值就被user引用了。去掉注释部分可成功运行。
结论:persistent状态对象是不能引用transient对象,这个错误不注意会经常遇到。
那么不存group,有没有办法能不能成功存入user呢?
通过级联操作可以。
级联是对象的连锁操作
级联适合删除、保存、修改。
在user.hbm.xml中设置manytoone标签的cascade属性为all或save-update、delete、none(默认是case="none")。这样即使不先执行session.save(group)也可以成功提交内容到数据库了。
cascade属性设置为除了none以外任何有意义的值, 它将把特定的操作传递到关联对象中。这个值就代表着Hibernate基本操作的名称, persist, merge, delete, save-update, evict, replicate, lock, refresh, 以及特别的值delete-orphan和all,并且可以用逗号分隔符 来组合这些操作,例如,cascade="persist,merge,evict"或 cascade="all,delete-orphan"。
console打印:
Hibernate: insert into t_group (g_name) values (?)
Hibernate: insert into t_user (u_name, u_group) values (?, ?)
----------mark1------------
Hibernate: insert into t_user (u_name, u_group) values (?, ?)
----------mark2------------
下面来做个例子,从用户中加载组的信息: public void testReferenceLoad(){ Session session = HibernateUtils.getSession(); try { session.beginTransaction(); User user = (User)session.load(User.class, 5); System.out.println("user.name = " + user.getName()+" user.group.name = " + user.getGroup().getName()); session.getTransaction().commit(); } catch (HibernateException e) { e.printStackTrace(); session.getTransaction().rollback(); }finally{ HibernateUtils.closeSession(session); } }
Console: Hibernate: select group0_.g_id as g1_1_0_, group0_.g_name as g2_1_0_ from t_group group0_ where group0_.g_id=?
user.name = 张三 user.group.name = 一起探索
这里不管casecade的值设为任意的都不影响级联查询的进行,因为级联只影响增、删、改的操作。
级联查询真正起作用的是User.hbm.xml中的many-to-one标签。
会在“多”的一方加入外键,指向“一”的一方,这个外键是由该标签下的column属性定义的,即不加column属性默认与“一”的一方的属性名字相同。
发表评论
-
Flex4+Spring3+Hibernate3+BlazeDS整合笔记
2012-01-20 01:20 970Flex4+Spring3+Hibernate3+BlazeD ... -
整合flex spring
2012-01-20 01:20 935整合flex spring 2010年07月01日 主要 ... -
实现FLEX 通过AMF跟PHP通信
2012-01-20 01:20 637实现FLEX 通过AMF跟PHP通 ... -
Flex + LCDS + Java 入门教程
2012-01-20 01:20 570Flex + LCDS + Java 入门教程 2010年0 ... -
Flex与Javascript之间的交互
2012-01-20 01:20 638Flex与Javascript之间的交 ... -
Rsync服务器搭建
2012-01-19 09:10 633Rsync服务器搭建 2011年01 ... -
网络攻击心得-让一切变得可能
2012-01-19 09:10 861网络攻击心得-让一切变得可能 2011年07月07日 讲 ... -
计算机英语词汇大全(1)
2012-01-19 09:10 558计算机英语词汇大全(1) ... -
中小企业网络构建 样题
2012-01-19 09:10 686中小企业网络构建 样题 ... -
导入/导出 Excel 的基本方法 JAVA EXCEL API简介
2012-01-19 09:10 865导入/导出 Excel 的基本 ... -
android 各系统区别(android 1.5- android 3.0)
2012-01-17 01:39 747android 各系统区别(android ... -
深入理解控制台程序
2012-01-17 01:39 1147深入理解控制台程序 2010年06月26日 控制台程序的 ... -
文本朗读器的设计与制作
2012-01-17 01:39 1175文本朗读器的设计与制作 2010年07月29日 文本朗读 ... -
DirectSound开发指南(四)
2012-01-17 01:39 2556DirectSound开发指南(四) 2 ... -
C++/CLI
2012-01-17 01:39 874C++/CLI 2010年08月12日 从2001年.n ... -
感慨啊感慨
2012-01-15 20:48 496感慨啊感慨 2011年12月07 ... -
Xin phep giay!
2012-01-15 20:48 626Xin phep giay! 2010年03月08 ... -
越南商旅
2012-01-15 20:48 546越南商旅 2009年10月15日 八月十六日我接到越南 ... -
SiteMesh教程
2012-01-11 12:27 585SiteMesh教程 2011年03月01日 sitem ... -
3049_java
2012-01-11 12:27 6363049_java 2011年03月01日 impor ...
相关推荐
NULL 博文链接:https://yxwang0615.iteye.com/blog/970729
这个是针对初学Hibernate一对多主键关联映射的源代码 ,希望对初学者有所帮助,开发环境是MyEclipse7.5和HIbernate3.2
资源名称:Hibernate3.2官方中文参考手册内容简介: Hibernate3.2官方中文参考手册,内容涉及Hibernate入门知识、配置、集合类映射、关联关系映射、组件、事务并发、批量处理、对象事件等知识。资源截图: 资源太大...
7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) ...
Hibernate3.2官方中文参考手册,内容涉及Hibernate入门知识、配置、集合类映射、关联关系映射、组件、事务并发、批量处理、对象事件等知识。
1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 ...1.3. 第二部分 - 关联映射 1.3.1. 映射Person类 1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 · · ·
本书内容主要包括三部分,第一部分介绍Java EE...第三部分示范开发了一个包含7个表,表之间具有复杂的关联映射、继承映射等关系,且业务也相对复杂的工作流案例,让读者理论联系实际,将三个框架真正运用到实际开发中去
7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) ...
7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) ...
15.3.4 把多对多关联分解为两个一对多关联 15.4 小结 15.5 思考题 第16章 Hibernate的检索策略 16.1 Hibernate的检索策略简介 16.2 类级别的检索策略 16.2.1 立即检索 16.2.2 延迟检索 16.3 一对多...
7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) ...
7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) ...
7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) 8.2. 在...
多对一(Many-to-one) 2.2.5.3. 集合类型 2.2.5.4. 用cascading实现传播性持久化(Transitive persistence) 2.2.5.5. 关联关系获取 2.2.6. 映射复合主键与外键 2.2.7. 映射二级表(secondary tables) 2.3. 映射...
第7章 高级实体关联映射 7.1 单值的实体关联 7.1.1 共享的主键关联 7.1.2 一对一的外键关联 7.1.3 用联结表映射 7.2 多值的实体关联 7.2.1 一对多关联 7.2.2 多对多关联 7.2.3 把...