`
xmq315nv
  • 浏览: 18374 次
社区版块
存档分类
最新评论

hibernate3.2多对一关联映射

 
阅读更多

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属性默认与“一”的一方的属性名字相同。
分享到:
评论

相关推荐

    hibernate3.2(六)多对一关联映射

    NULL 博文链接:https://yxwang0615.iteye.com/blog/970729

    Hibernate一对多主键关联映射源代码

    这个是针对初学Hibernate一对多主键关联映射的源代码 ,希望对初学者有所帮助,开发环境是MyEclipse7.5和HIbernate3.2

    Hibernate3.2官方中文参考手册

    资源名称:Hibernate3.2官方中文参考手册内容简介: Hibernate3.2官方中文参考手册,内容涉及Hibernate入门知识、配置、集合类映射、关联关系映射、组件、事务并发、批量处理、对象事件等知识。资源截图: 资源太大...

    hibernate3.2中文文档(chm格式)

    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 参考手册》

    Hibernate3.2官方中文参考手册,内容涉及Hibernate入门知识、配置、集合类映射、关联关系映射、组件、事务并发、批量处理、对象事件等知识。

    hibernate 3.2 官方中文参考手册(HTML)

    1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 ...1.3. 第二部分 - 关联映射 1.3.1. 映射Person类 1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 · · ·

    轻量级J2EE企业应用实战Struts+Spring+Hibernate整合开发

    本书内容主要包括三部分,第一部分介绍Java EE...第三部分示范开发了一个包含7个表,表之间具有复杂的关联映射、继承映射等关系,且业务也相对复杂的工作流案例,让读者理论联系实际,将三个框架真正运用到实际开发中去

    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) ...

    HibernateAPI中文版.chm

    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) ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     15.3.4 把多对多关联分解为两个一对多关联  15.4 小结  15.5 思考题 第16章 Hibernate的检索策略  16.1 Hibernate的检索策略简介  16.2 类级别的检索策略  16.2.1 立即检索  16.2.2 延迟检索  16.3 一对多...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    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) ...

    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) ...

    Hibernate 中文 html 帮助文档

    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. 在...

    Hibernate Annotations 中文文档

    多对一(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. 映射...

    Hibernate实战(第2版 中文高清版)

     第7章 高级实体关联映射   7.1 单值的实体关联   7.1.1 共享的主键关联   7.1.2 一对一的外键关联   7.1.3 用联结表映射   7.2 多值的实体关联   7.2.1 一对多关联   7.2.2 多对多关联   7.2.3 把...

Global site tag (gtag.js) - Google Analytics