一、前言

前面我们已经学过hibernate的基础,学会增删改查简单的操作,然而我们数据库中存在着1对多,多对1,多对多的关系,hibernate又是基于ORM基础上的开源框架,可以让我们不用去编写SQL语句,它会自动生成,mybatis也是基于ORM基础上的开源框架,只不过需要我们编写sql语句,算是一个半自动的orm吧,今天讲解的主要是1对多的映射关系。

1.1、创建项目

这里使用到的是组和用户的关系,1个组可以有多个用户。Group和User(这里笔者说个题外话,注意注意:映射文件中table的名字一定不能是mysql的关键字,笔者就是使用了Group,一直报sql语法错误,后来才发现原来Group是关键字

新建实体类:User.java

  1. package com.hibernate.one_manys;
  2.  
  3. public class User {
  4. private int uid;
  5. private String uname;
  6. public int getUid() {
  7. return uid;
  8. }
  9. public void setUid(int uid) {
  10. this.uid = uid;
  11. }
  12. public String getUname() {
  13. return uname;
  14. }
  15. public void setUname(String uname) {
  16. this.uname = uname;
  17. }
  18. public User(String uname)
  19. {
  20. this.uname=uname;
  21. }
  22. }

User

新建实体类:Group.java,其中添加User的集合,表示一个组中存在多个用户,使用集合表示

  1. package com.hibernate.one_manys;
  2.  
  3. import java.util.HashSet;
  4. import java.util.Set;
  5.  
  6. public class Group {
  7. private int gid;
  8. private String gtitle;
  9. private Set<User> users = new HashSet<User>();
  10. public Set<User> getUsers() {
  11. return users;
  12. }
  13. public void setUsers(Set<User> users) {
  14. this.users = users;
  15. }
  16. public int getGid() {
  17. return gid;
  18. }
  19. public void setGid(int gid) {
  20. this.gid = gid;
  21. }
  22. public String getGtitle() {
  23. return gtitle;
  24. }
  25. public void setGtitle(String gtitle) {
  26. this.gtitle = gtitle;
  27. }
  28. }

Group

新建User的配置文件:User.hbm.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  4. <hibernate-mapping>
  5. <class name="com.hibernate.one_manys.User" table="USER">
  6. <id name="uid" type="int">
  7. <column name="UID"></column>
  8. <generator class="native"></generator>
  9. </id>
  10. <property name="uname" column="UNAME"></property>
  11. </class>
  12. </hibernate-mapping>

新建Group的配置文件:Group.hbm.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  4. <hibernate-mapping>
  5. <!-- 注意点:Group是mysql中的关键字,如果使用会报语句错误 -->
  6. <!-- native:根据底层数据库的能力选择identity, sequence 或者hilo中的一个。 -->
  7. <class name="com.hibernate.one_manys.Group" table="Groups">
  8. <id name="gid" type="int">
  9. <column name="GID"/>
  10. <generator class="native"/>
  11. </id>
  12. <property name="gtitle" type="java.lang.String">
  13. <column name="GTITLE"/>
  14. </property>
  15. <!-- cascade:级联操作
  16. all : 所有情况下均进行关联操作。
  17. none:所有情况下均不进行关联操作。这是默认值。
  18. save-update:在执行save/update/saveOrUpdate时进行关联操作。
  19. delete:在执行delete时进行关联操作
  20. -->
  21. <set name="users" table="User" cascade="delete">
  22. <!-- column:指明了在User表里有一个gid的列名,是指向Group表的外键 -->
  23. <key column="gid"/>
  24. <!-- 一对多的映射 -->
  25. <one-to-many class="com.hibernate.one_manys.User"/>
  26. </set>
  27. </class>
  28. </hibernate-mapping>

注意:这里使用到cascade级联操作,顾名思义,就是你执行增删改查的时候会触发另一张表,简单说来就是,当你主表执行删除时,从表也会随之删除。

接下来编写测试类:

  1. package com.hibernate.one_manys;
  2.  
  3. import org.hibernate.Session;
  4. import org.hibernate.SessionFactory;
  5. import org.hibernate.Transaction;
  6. import org.hibernate.cfg.Configuration;
  7. import org.hibernate.service.ServiceRegistry;
  8. import org.hibernate.service.ServiceRegistryBuilder;
  9.  
  10. /**
  11. * 简单的1对多的的数据关系,使用到的表有:Groups(注意点:Group是数据库中的关键字),User,其中Groups是一,User是多
  12. * 使用到的类:Group,User;配置文件:Group.xml,User.xml
  13. * 步骤:
  14. * 1、新建实体类Group和User
  15. * 2、新建映射文件Group.hbm.xml和User.hbm.xml
  16. * 3、在配置文件hibernate.cfg.xml配置文件中声明映射文件
  17. * 4、新建测试类测试功能模块
  18. * 注意点:
  19. * 1、在映射文件中定义映射的表不能是关键字,其中Group是关键字,所以一直报语法错误
  20. * */
  21. public class Test_1 {
  22. private static SessionFactory sessionfactory;
  23. private static Session session;
  24. public static void main(String[] args){
  25. //配置
  26. Configuration config = new Configuration().configure();
  27. //注册服务
  28. ServiceRegistry service = new ServiceRegistryBuilder().applySettings(config.getProperties())
  29. .buildServiceRegistry();
  30.  
  31. //实例化sessionfactory工厂
  32. sessionfactory = config.buildSessionFactory(service);
  33. //打开一个session
  34. session = sessionfactory.openSession();
  35.  
  36. //添加
  37. add();
  38.  
  39. //查询
  40. sel();
  41.  
  42. //修改
  43. //update();
  44.  
  45. //删除
  46. del();
  47. }
  48. //添加语句
  49. public static void add(){
  50. Transaction transaction = session.beginTransaction();
  51. Group g = new Group();
  52. g.setGtitle("学生会");
  53. User u = new User("张三");
  54. User u1 = new User("李四");
  55. g.getUsers().add(u);
  56. g.getUsers().add(u1);
  57. //注意点:需要保存组的对象
  58. session.save(g);
  59. session.save(u);
  60. session.save(u1);
  61. transaction.commit();
  62. }
  63.  
  64. //查询语句
  65. public static void sel(){
  66. Group g = (Group) session.get(Group.class, 1);
  67. System.out.println(g.getGtitle()+","+g.getUsers().size());
  68.  
  69. for(User u: g.getUsers()){
  70. System.out.println(u.getUname());
  71. }
  72. }
  73.  
  74. //修改语句
  75. public static void update(){
  76. Group g = (Group)session.get(Group.class,1);
  77. g.setGtitle("技术会");
  78. for(User u : g.getUsers()){
  79. if(u.getUname().equals("张三")){
  80. u.setUname("陈凯辉");
  81. g.getUsers().add(u);
  82. }
  83. }
  84. Transaction transaction = session.beginTransaction();
  85. session.save(g);
  86. transaction.commit();
  87. }
  88. //删除语句
  89. //注意级联事件
  90. public static void del(){
  91. Group g = (Group)session.get(Group.class, 1);
  92. Transaction transaction = session.beginTransaction();
  93. session.delete(g);
  94. transaction.commit();
  95. }
  96. }

效果图为:

总结:

Hibernate4.2.4入门(二)——一对多的映射关系的更多相关文章

  1. docker入门(二)容器与镜像的关系

    [编者的话]本文用图文并茂的方式介绍了容器.镜像的区别和Docker每个命令后面的技术细节,能够很好的帮助读者深入理解Docker. 这篇文章希望能够帮助读者深入理解Docker的命令,还有容器(co ...

  2. MyBatis 中一对一和一对多的映射关系

    1 一对一映射 比如每位学生有一个地址. public class Address { private Integer addrId; private String street; private S ...

  3. Spring Boot 入门系列(二十八) JPA 的实体映射关系,一对一,一对多,多对多关系映射!

    前面讲了Spring Boot 使用 JPA,实现JPA 的增.删.改.查的功能,同时也介绍了JPA的一些查询,自定义SQL查询等使用.JPA使用非常简单,功能非常强大的ORM框架,无需任何数据访问层 ...

  4. Hibernate4.x之入门篇

    Hibernate作为一个优秀的持久化框架.ORM框架.在日常的Java开发中常常用到.本文主要通过一个简单的例子来介绍下Hibernate4.x的入门知识. 新建一个Java项目,并加入Hibern ...

  5. 爬虫入门二 beautifulsoup

    title: 爬虫入门二 beautifulsoup date: 2020-03-12 14:43:00 categories: python tags: crawler 使用beautifulsou ...

  6. mybatis入门_一对多,多对多映射以及整合spring框架

    一.一对多映射. 1.1 一对多映射之根据多的一方关联查询一的一方 示例:查询出具体的订单信息,同时也查询出来订单的用户信息. 引入的订单表如下所示: 框选出来的为具体的外键. 订单的Pojo类如下所 ...

  7. 【原创】NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示

    前言 NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2.而Netty的主要版本是Netty3和Netty ...

  8. Swift语法基础入门二(数组, 字典, 字符串)

    Swift语法基础入门二(数组, 字典, 字符串) 数组(有序数据的集) *格式 : [] / Int / Array() let 不可变数组 var 可变数组 注意: 不需要改变集合的时候创建不可变 ...

  9. Thinkphp入门 二 —空操作、空模块、模块分组、前置操作、后置操作、跨模块调用(46)

    原文:Thinkphp入门 二 -空操作.空模块.模块分组.前置操作.后置操作.跨模块调用(46) [空操作处理] 看下列图: 实际情况:我们的User控制器没有hello()这个方法 一个对象去访问 ...

随机推荐

  1. 安卓GreenDao框架一些进阶用法整理

    大致分为以下几个方面: 一些查询指令整理 使用SQL语句进行特殊查询 检测表字段是否存在 数据库升级 数据库表字段赋初始值 一.查询指令整理 1.链式执行的指令 return mDaoSession. ...

  2. 数据库 oracle数据库基本知识

    sqlplus登录 普通用户登录 c:\>sqlplus 请输入用户名:scott 请输入口令: sqlplus scott/ quit退出 管理员登录 sqlplus /nolog 连接数据库 ...

  3. 从贝叶斯到粒子滤波——Round 1

    粒子滤波确实是一个挺复杂的东西,从接触粒子滤波到现在半个多月,博主哦勒哇看了N多篇文章,查略了嗨多资料,很多内容都是看了又看,细细斟酌.今日,便在这里验证一下自己的修炼成果,请各位英雄好汉多多指教. ...

  4. 一步步开发自己的博客 .NET版(5、Lucenne.Net 和 必应站内搜索)

    前言 这次开发的博客主要功能或特点:    第一:可以兼容各终端,特别是手机端.    第二:到时会用到大量html5,炫啊.    第三:导入博客园的精华文章,并做分类.(不要封我)    第四:做 ...

  5. ES6+ 现在就用系列(二):let 命令

    系列目录 ES6+ 现在就用系列(一):为什么使用ES6+ ES6+ 现在就用系列(二):let 命令 ES6+ 现在就用系列(三):const 命令 ES6+ 现在就用系列(四):箭头函数 => ...

  6. 抛弃jQuery:DOM API之选择元素

    原文链接:http://blog.garstasio.com/you-dont-need-jquery/selectors/ 我的Blog:http://cabbit.me/you-dont-need ...

  7. 自定义ActionBar标题与菜单中的文字样式

    自定义标题文字样式 标题样式是ActionBar样式的一部分,所以要先定义ActionBar的样式 <style name="AppTheme" parent="A ...

  8. angular1

    1.双向绑定: 可进可出 2.依赖注入 函数有定义方定义 3.MVC M: Model 模型--数据 V: View 视图--表现层 C: Controller  控制器--业务逻辑 4.模板: {{ ...

  9. Hyper-V1:创建和管理虚拟机

    Hyper-V是微软的管理虚拟机(Virtual Machine)的服务,在安装Hyper-V功能之后,系统自动安装可视化的虚拟机管理工具:Hyper-V Manager.在同一台物理机上,能够使用H ...

  10. Dapper:The member of type SeoTKD cannot be used as a parameter Value

    异常汇总:http://www.cnblogs.com/dunitian/p/4523006.html#dapper 上次说了一下Dapper的扩展Dapper.Contrib http://www. ...