zoukankan      html  css  js  c++  java
  • 转Hibernate 一对多关联的CRUD__@ManyToOne(cascade=(CascadeType.ALL))

    一:Group和Users两个类

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

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

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

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

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

    二:C增

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

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

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

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

    三: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也取出来,

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

    四:U更新

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

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

     

    五:D删

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

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

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

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

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

  • 相关阅读:
    张艾迪(创始人):扫清头脑里的尘土继续向前
    张艾迪(创始人):世界最高级创始人
    张艾迪(创始人):发明整个世界+224C个国家
    张艾迪(创始人):发明Global.World.224C的天才
    张艾迪(创始人): 我出现在世界前的那些时光
    张艾迪(创始人):23岁.年少不喜欢浮华的我
    张艾迪(创始人):世界级天才女孩Eidyzhang
    张艾迪(创始人):23岁天才的创业史
    Python基础学习-8
    Python基础学习-7
  • 原文地址:https://www.cnblogs.com/zhangmingcheng/p/6650365.html
Copyright © 2011-2022 走看看