一:Group和Users两个类

假定一个组里有n多用户,但是一个用户只对应一个用户组。

1.所以Group对于Users是“一对多”的关联关系@OneToMany

Users对于Group是“多对一”@ManyToOne

2.CRUD时候,希望是能从具体用户Users查到其对应的Group,反过来也能通过Group查到具体Users,所以是双向关联

(所以要用mappedBy去除冗余信息)

  1.  
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    @Entity  
    @Table(name="t_Group")//指定一个表名  
    public class Group   
    {  
        private int id;  
        private String name;  
        private Set<Users> users = new HashSet<Users>();  
      
        @Id  
        @GeneratedValue//主键用自增序列  
        public int getId() {  
            return id;  
        }  
        @OneToMany(mappedBy="group",cascade=(CascadeType.ALL))//以“多”一方为主导管理,级联用ALL  
        public Set<Users> getUsers() {  
            return users;  
        }  
  1.  
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    @Entity  
    @Table(name="t_Users")  
    public class Users   
    {  
        private int id;  
        private String name;  
        private Group group;  
      
        @Id  
        @GeneratedValue  
        public int getId() {  
            return id;  
        }  
        @ManyToOne(fetch=FetchType.LAZY,cascade=(CascadeType.ALL))//解决1+N,级联用ALL  
        @JoinColumn(name="groupId")//指定外键名称,不指定的默认值是group_Id  
        public Group getGroup() {  
            return group;  
        }  

二:C增

cascade:级联,只影响cud,不影响r

(all全都级联,persist存储时级联,remove删除时级联)

如果没有设置cascade,默认需要save(Group)和save(users),两个都要存,设置级联之后,只存一个就行了

级联依赖于这句:@ManyToOne(cascade=(CascadeType.ALL))//需要依赖于其他的东西时候
设置好正反向之后,多个有级联关系的对象就一起被保存了

  1.  
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    @Test  
    public void testC() {     
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();  
           session.beginTransaction();  
      
           Users u1 = new Users();  
           Users u2 = new Users();  
           u1.setName("u1");  
           u2.setName("u2");  
           //u1和u2的id自增  
             
           Group g = new Group();  
           g.setName("g1");  
           //g的id自增  
             
           g.getUsers().add(u1);//正向  
           g.getUsers().add(u2);  
             
           u1.setGroup(g);//反向  
           u2.setGroup(g);//不然u1和u2中的group信息为空  
             
           session.save(g);//因为设置级联,所以存储g时候也把u1和u2存上了。  
           //不设置级联的话,还要存储u1和u2  
      
           session.getTransaction().commit();  
           HibernateUtil.getSessionFactory().close();           
    }

三:R查

默认会这样处理(平时管用的思路也是这样):

1.取“多”的时候,把“一”取出来
2.取“一”时,不取“多”的,用到时候再去取(看user信息时候一般看组名,看group时候user信息太多不必看)

fetch管读取,cascade管增删改
@OneToMany(mappedBy=”group”,cascade=(CascadeType.ALL),fetch=FetchType.EAGER)
@OneToMany默认的是LAZY,@ManyToOne默认是EAGER

User u = (User)s.get(User.class,1);
//取user时候,把group也取出来,

  1.  
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Users u = (Users)session.get(Users.class,11);//取id为11号的u  
    //hibernate产生的语句里也把group拿出来了:group1_.id as id0_0_,和group1_.name as name0_0_   
    Hibernate:   
        select  
            users0_.id as id1_1_,  
            users0_.groupId as groupId1_1_,  
            users0_.name as name1_1_,  
            group1_.id as id0_0_,  
            group1_.name as name0_0_   
        from  
            t_Users users0_   
        left outer join  
            t_Group group1_   
                on users0_.groupId=group1_.id   
        where  
            users0_.id=?  

只取出Group的话,不会去查询里边的user

  1.  
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //只取出Group的话,不会去查询里边的user  
    Group group = (Group)session.get(Group.class,11);  
    Hibernate:   
        select  
            group0_.id as id0_0_,  
            group0_.name as name0_0_   
        from  
            t_Group group0_   
        where  
            group0_.id=?

四:U更新

注意:fetch影响两者读取顺序(两边都设成EAGER要多取出一次),反正都要取,具体再试

@OneToMany,@ManyToOne都写cascade=(CascadeType.ALL)
update时候自动关联更新

  1.  
    1
    2
    3
    4
    //因为cascade=(CascadeType.ALL),所以自动关联更新  
    Users u = (Users)session.load(Users.class,11);//取id为11号的u  
    u.setName("u250");  
    u.getGroup().setName("gp01");

五:D删

删多:实测只删掉目的项目,不关联其他
先load(就是select)一下,确认有之后,再删

没有遇到:不能直接s.delete(u),因为u和group有级联,group和所有users都有级联,一下就够给删掉了的情况
不过严谨起见,还是设置一个u.setGroup(null);比较好

  1.  
    1
    2
    3
    4
    Users u1 = new Users();  
    u1.setId(18);  
    u1.setGroup(null);//严谨起见,应该先让俩表脱离关联  
    session.delete(u1);

HQL对应的语句(作用是一样的):s.createQuery(“delete from User u where u.id = 1”).executeUpdate();//User是类名

删一:如果有子项目,报错不让删除

Group g = (Group)s.load(Group.class,1);
s.delete(g);

    1.  
      1
      2
      3
      4
      5
      6
      7
      8
      Hibernate:   
          delete   
          from  
              t_Group   
          where  
              id=?  
      22:56:20,691  WARN SqlExceptionHelper:143 - SQL Error: 2292, SQLState: 23000  
      22:56:20,692 ERROR SqlExceptionHelper:144 - ORA-02292: 违反完整约束条件 (SCOTT.FK9F52DA5D4E678049) - 已找到子记录

转Hibernate 一对多关联的CRUD__@ManyToOne(cascade=(CascadeType.ALL))的更多相关文章

  1. 03.Hibernate一对多关联

    前言:在域模型中,类与类之间最普遍的关系就是关联关系,在UML语言中关联关系是有方向的.在数据库中表与表之间也会有关联关系,本节介绍通过Hibernate映射一对多的关联关系,这是一种最普遍的关联关系 ...

  2. hibernate一对多关联映射

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

  3. Hibernate一对多关联映射的配置及其级联删除问题

    首先举一个简单的一对多双向关联的配置: 一的一端:QuestionType类 package com.exam.entity; import java.util.Set; public class Q ...

  4. Hibernate一对多关联

    一对多双向关联关系:(Dept/Emp的案例) 既可以根据在查找部门时根据部门去找该部门下的所有员工,又能在检索员工时获取某个员工所属的部门. 步骤如下: 1.构建实体类(部门实体类加set员工集合) ...

  5. hibernate 一对多关联

    package com.bjsxt.hibernate; import java.util.HashSet; import java.util.Set; import javax.persistenc ...

  6. hibernate 一对多双向关联 详解

    一.解析: 1.  一对多双向关联也就是说,在加载班级时,能够知道这个班级所有的学生. 同时,在加载学生时,也能够知道这个学生所在的班级. 2.我们知道,一对多关联映射和多对一关联映射是一样的,都是在 ...

  7. Hibernate一对多单向关联和双向关联映射方法及其优缺点 (待续)

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

  8. Java进阶知识10 Hibernate一对多_多对一双向关联(Annotation+XML实现)

    本文知识点(目录): 1.Annotation 注解版(只是测试建表)    2.XML版 的实现(只是测试建表)    3.附录(Annotation 注解版CRUD操作)[注解版有个问题:插入值时 ...

  9. Hibernate—— 一对多 和 多对多关联关系映射(xml和注解)总结(转载)

    One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XML/Annotation) 懒加载和积极加载 一对多双向外键关联(XML/Annotati ...

随机推荐

  1. EasyUI Pagination 分页分页布局定义 显示按钮布局

    //分页布局定义.该属性自版本 1.3.5 起可用.//布局项目包括一个或多个下列值://1.list:页面尺寸列表.//2.sep:页面按钮分割.//3.first:第一个按钮.//4.prev:前 ...

  2. Python之查询美国护照状态

    该程序会每隔至少1秒进行一次护照状态查询 需要修改passportNo变量为自己的护照号码. 另外需要pip install beautifulsoup4 #coding=utf-8 import r ...

  3. Spring Cloud对于中小型互联网公司来说是一种福音

    Spring Cloud对于中小型互联网公司来说是一种福音,因为这类公司往往没有实力或者没有足够的资金投入去开发自己的分布式系统基础设施,使用Spring Cloud一站式解决方案能在从容应对业务发展 ...

  4. php -- 魔术方法 之 自动加载:__autoload()

    自动加载类 背景: 很多开发者写面向对象的应用程序时对每个类的定义建立一个 PHP 源文件.一个很大的烦恼是不得不在每个脚本开头写一个长长的包含文件列表(每个类一个文件). 在 PHP 5 中,不再需 ...

  5. 《Java并发编程实战》第八章 线程池的使用 读书笔记

    一.在任务与运行策略之间的隐性解耦 有些类型的任务须要明白地指定运行策略,包含: . 依赖性任务.依赖关系对运行策略造成约束.须要注意活跃性问题. 要求线程池足够大,确保任务都能放入. . 使用线程封 ...

  6. eclipse中打开含有汉字的properties文件显示乱码

    http://blog.csdn.net/wangjun5159/article/details/46965831

  7. Struts2_day02--课程安排_结果页面配置

    Struts2_day02 上节内容 今天内容 结果页面配置 全局结果页面 局部结果页面 Result标签的type属性 Action获取表单提交数据 使用ActionContext类获取 使用Ser ...

  8. UnboundLocalError: local variable 'merchantCode' referenced before assignment

    问题描述:变量赋值前未定义 定位原因:变量没有结果返回,导致赋值失败

  9. 内存泄露,GC相关

    内存泄露就是对象不在GC的掌控之内 下面对象会发生内存泄露现象: 1.没有引用的对象 2.虚,软,弱 引用对象 GC引用的对象指的是 1.JavaStack中引用的对象 2.方法区中静态引用指向的对象 ...

  10. 过滤一个Collection最好的方法

    private static List<Integer> filter(List<Integer> list){ Iterator<Integer> it = li ...