1.
模型
一个用户组(group)对应多个用户。
2.
实体类(省略set,get方法)
public class User {
private int id;
private String name;
}
public class Group {
private int id;
private String name;
private Set Users;
}
3.
数据模型
mysql> desc t_user;
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
| groupid | int(11) | YES | MUL | NULL | |
+---------+--------------+------+-----+---------+----------------+
mysql> desc t_group;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
+-------+--------------+------+-----+---------+----------------+
4.
映射文件
一个用户组对应多个用户。
多对一关联映射:是在"多"的一端添加一个外键指向"一"的一端,它维护的关系为多到一的关系,如:当载入一个用户(user)时将载入组(group)的信息。
一对多关联映射:是在"多"的一端添加一个外键指向"一"的一端,它维护的关系为一到多的关系,如:当载入一个组(group)时将载入此组用户的信息。
可以说,一对多和多对一的映射策略是一致的,都是通过在"多"的一端添加一个外键指向"一"的一端,只是站的角度不同。
User.hbm.xml:
<hibernate-mapping>
<class name="com.dvnchina.hibernate.User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
</hibernate-mapping>
Group.hbm.xml:
<hibernate-mapping>
<class name="com.dvnchina.hibernate.Group" table="t_group">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<!-- <set name="users" cascade="all">-->
<set name="users" order-by="name">
<key column="groupid"/>
<one-to-many class="com.dvnchina.hibernate.User"/>
</set>
</class>
</hibernate-mapping>
5.
测试
public class TestOneToMany extends TestCase {
public void testSave(){
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
Set<User> users = new HashSet<User>();
for(int i=0;i<9;i++){
User user = new User();
user.setName("yang"+i);
//session.save(user);
users.add(user);
}
//当user没有save,即为Transient对象,将抛出TransientObjectException
//因为持久对象不能直接引用瞬时对象,所以我们需要先save(user)使其为持久对象后
//再引用
Group group = new Group();
group.setName("凤山人在线");
group.setUsers(users);
session.save(group);
tx.commit();
HibernateUtils.closeSession(session);
}
public void testCascade(){
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
Set<User> users = new HashSet<User>();
for(int i=0;i<9;i++){
User user = new User();
user.setName("yang"+i);
users.add(user);
}
//在user.hbm.xml中的one-to-many中设置级联设置cascade="all",此时不需要使user
//为持久对象而可以直接使用它,因为save(group)时将级联保存user
Group group = new Group();
group.setName("凤山人在线");
group.setUsers(users);
session.save(group);
tx.commit();
HibernateUtils.closeSession(session);
}
//级联是对象之间的连锁操作(只对增删改起作用,对load不起作用,load是由one-to-many维护的)
public void testLoad(){
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
Group group = (Group) session.load(Group.class, 2);
Set list = group.getUsers();
for(Iterator ite = list.iterator();ite.hasNext();){
User user = (User) ite.next();
System.out.println(group.getName()+","+user.getName());
}
tx.commit();
HibernateUtils.closeSession(session);
}
}

附件:http://down.51cto.com/data/2351411

本文转自 yzzh9 51CTO博客,原文链接:http://blog.51cto.com/java999/119432,如需转载请自行联系原作者

一对多关联映射(单向关联)见项目:me_one_to_many相关推荐

  1. Hibernate 、多表关联映射-组件关联映射(component)

    组件关联映射可以将一些简小的数据与主题放在一个表中,例如firstName 和LastName这两个结合在一起可以组成一个名字,但是再分别将这两个再建一个表就不太合适了,这个时候可以用到组件关联映射: ...

  2. Hibernate映射详解(二)--多对一,一对多单向,一对多双向关联映射

    在我们以前的数据库设计中,设计表就不是一件轻松的事情.多种事物之间往往都是有这样那样的关系的.那怎样设计表格,才能既将事情描述明白,又能使数据库设计的比较合理呢?那里我们提供了好多规范,好多约束来满足 ...

  3. 【SSH系列】Hibernate映射 -- 一对多关联映射

         映射原理        一对多关联映射和多对一关联映射的映射原理是一样一样的,所以说嘛,知识都是相通的,一通百通,为什么说一对多关联映射和多对一关联映射是一样的呢?因为她们都是在多的一端加入 ...

  4. hibernate一对多关联映射

    一对多关联映射 映射原理 一对多关联映射和多对一关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端.关联关系都是由多端维护,只是在写映射时发生了变化. 多对一和一对多的区别 多对一和 ...

  5. 初识Hibernate之关联映射(一)

    上篇文章我们对持久化对象进行的学习,了解了它的三种不同的状态并通过它完成对数据库的映射操作.但这都是基于单张表的操作,如果两张或者两张以上的表之间存在某种关联,我们又该如何利用持久化对象进行操作呢?本 ...

  6. Java三大框架之——Hibernate关联映射与级联操作

    什么是Hibernate中的关联映射? 简单来说Hibernate是ORM映射的持久层框架,全称是(Object Relational Mapping),即对象关系映射. 它将数据库中的表映射成对应的 ...

  7. Hibernate之关联映射

    在现实生活中 ,很少有对象是孤立存在的,例如老师,往往和被授课的学生存在关联关系,如果得到了某个老师实例,那么我们就可以直接获取该老师 对应的全部学生.同样,我们得到了一个学生实例  ,我们也可以获取 ...

  8. Mybatis关联映射;Mybatis注解

    Mybatis关联映射 Mybatis关联映射的用途: 在实际的开发过程中,对于数据库的操作除了单表外往往会涉及到多张表,这些操作在面向对象中就涉及到了对象与对象之间的关联关系.针对多表之间的操作,M ...

  9. Hibernate一对多单向关联和双向关联映射方法及其优缺点

    一对多关联映射和多对一关联映射实现的基本原理都是一样的,既是在多的一端加入一个外键指向一的一端外键,而主要的区别就是维护端不同. 它们的区别在于维护的关系不同: 一对多关联映射是指在加载一的一端数据的 ...

最新文章

  1. 如何使用Leangoo看板统计中的任务周期?
  2. 数据中心智慧机房解决方案
  3. 让容器应用管理更快更安全,Dragonfly 发布 Nydus 容器镜像加速服务
  4. Ubuntu下报错PCIe Bus Error:severity=Corrected, type=Physical Layer, id=00e8(Receiver ID)
  5. JZOJ 5068. 【GDSOI2017第二轮模拟】树
  6. Linux基础命令---get获取ftp文件
  7. oracle之set运算符和练习
  8. (九)nodejs循序渐进-Express框架(进阶篇)
  9. java 动态转换器,Java 编程的动态性,第 5 部分: 动态转换类
  10. 【Java】Java数据库访问体系重点总结
  11. mysql重新构建自增长_mysql 建表后 重新构建 自增字段 (保留 原有字段结构)
  12. BSD/MIT/Apache许可证印象尚可
  13. Python下载prettyloaded的swf
  14. 最新酷睿计算机配置,三款intel九代酷睿全系列组装电脑配置推荐 每一款CPU都支持超频...
  15. oracle9.2.0.7,Oracle9.2.0.1升级到9.2.0.7
  16. java 多线程局域网快速传输文件,java大文件复制最高效方法多线程FileChannel
  17. php 美化登录页面,把你的WordPress登录页面进行CSS美化
  18. Java截图转文字程序
  19. 2018 ISCC re\web\misc WP
  20. 看google如何招人

热门文章

  1. ECMAScript5 Object的新属性方法
  2. Springboot使用thymeleaf进行页面跳转
  3. JavaScript初学者必看“new”
  4. 容器间通信的三种方式 - 每天5分钟玩转 Docker 容器技术(35)
  5. 【Mac】『终端』显示、隐藏所有文件
  6. 20分钟打造你的Bootstrap站点
  7. Tomcat5.5报错:Apache Portable Runtime was not found
  8. ORACLE一致读与ORA-01555
  9. 【Visual C++】游戏开发笔记四十 浅墨DirectX教程之八 绘制真实质感的三维世界:光照与材质专场...
  10. linux配置gprs modem