Hibernate 一对多关联的CRUD__@ManyToOne(cascade=(CascadeType.ALL))

一:Group和Users两个类

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

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

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

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

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


  1. @Entity  
  2. @Table(name="t_Group")//指定一个表名  
  3. public class Group   
  4. {  
  5.     private int id;  
  6.     private String name;  
  7.     private Set<Users> users = new HashSet<Users>();  
  8.   
  9.     @Id  
  10.     @GeneratedValue//主键用自增序列  
  11.     public int getId() {  
  12.         return id;  
  13.     }  
  14.     @OneToMany(mappedBy="group",cascade=(CascadeType.ALL))//以“多”一方为主导管理,级联用ALL  
  15.     public Set<Users> getUsers() {  
  16.         return users;  
  17.     }  

  1. @Entity  
  2. @Table(name="t_Users")  
  3. public class Users   
  4. {  
  5.     private int id;  
  6.     private String name;  
  7.     private Group group;  
  8.   
  9.     @Id  
  10.     @GeneratedValue  
  11.     public int getId() {  
  12.         return id;  
  13.     }  
  14.     @ManyToOne(fetch=FetchType.LAZY,cascade=(CascadeType.ALL))//解决1+N,级联用ALL  
  15.     @JoinColumn(name="groupId")//指定外键名称,不指定的默认值是group_Id  
  16.     public Group getGroup() {  
  17.         return group;  
  18.     }  




二:C增

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

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

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

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

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




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

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

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




四:U更新

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

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




五:D删

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

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

  1. Users u1 = new Users();  
  2. u1.setId(18);  
  3. u1.setGroup(null);//严谨起见,应该先让俩表脱离关联  
  4. 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. Hibernate:   
  2.     delete   
  3.     from  
  4.         t_Group   
  5.     where  
  6.         id=?  
  7. 22:56:20,691  WARN SqlExceptionHelper:143 - SQL Error: 2292, SQLState: 23000  
  8. 22:56:20,692 ERROR SqlExceptionHelper:144 - ORA-02292: 违反完整约束条件 (SCOTT.FK9F52DA5D4E678049) - 已找到子记录 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值