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

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参考文档

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

Global site tag (gtag.js) - Google Analytics