hibernate-关联关系中的crud-13

ORMapping编程模型:
1. 映射(JPA annotation(重要,现在讲的),hibernate annotaiton extention,
hibernate xml,jap xml)
2. 编程接口(jpa编程接口,hibernate编程接口(现在讲的))

保存User类的情况

  1. many2one-one2many的双向关联中,例如group和user的关联,
  2. 在User类中设置 @ManyToOne(cascade = {CascadeType.ALL}),在保存User的时候会级联保存group
  3. (all任何操作,persist 存储操作,remove删除)
  4. 在@one2one,one2many,many2one等都可设置级联

注意:它只是简化了代码,也可以手动的单独保存
双向关系在程序中要设定双向关联
双向一定要设定mappedby

保存user:默认不保存group,需要设置cascade级联保存

    @OneToMany(mappedBy = "group",cascade = CascadeType.ALL,fetch = FetchType.EAGER)

读user:默认会读出group(cascade不影响读,影响CUD),fetch参数影响读(两个选项EAGER、LAZY,默认是EAGER)
更新user:

     s.beginTransaction();
        User u = (User)s.get(User.class, 1);
        u.setName("u222");
        u.getGroup().setName("g222");
        s.update(u);
        s.getTransaction().commit();

删除user,如果不想被级联删除group两种解决方案:

        // 1
//        u.setGroup(null);
//        s.delete(u);
        // 2
        s.createQuery( "delete from User u where u.id=1 " ).executeUpdate();
@Entity
@Table(name = "t_user")
public class User {
    private int id;
    private Group group;
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @ManyToOne(cascade = {CascadeType.ALL})
    public Group getGroup() {
        return group;
    }

    public void setGroup(Group group) {
        this.group = group;
    }

    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }


}
@Test
    public void testSaveUser(){
        User u = new User();
        u.setName("u1");
        Group g = new Group();
        g.setName("g1");
        u.setGroup(g);

        Session s = sessionFactory.getCurrentSession();
        s.beginTransaction();
        s.save(u);
        s.getTransaction().commit();
    }

保存Group类的情况

保存group:默认不保存user,需要设置cascade级联保存
读group:默认不会读出user(cascade不影响读,影响CUD),fetch参数影响读(两个选项EAGER、LAZY,默认是LAZY)
删除group:默认的情况会级联删除user,如果不想级联,可用hql

    @OneToMany(mappedBy = "group",cascade = CascadeType.ALL,fetch = FetchType.EAGER)
@Entity
@Table(name = "t_group")
public class Group {
    private int id;
    private Set<User> users = new HashSet<User>();
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @OneToMany(mappedBy = "group",cascade = CascadeType.ALL)
    public Set<User> getUsers() {
        return users;
    }

    public void setUsers(Set<User> users) {
        this.users = users;
    }

    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}
@Test
    public void testSaveGroup(){
        User u1 = new User();
        u1.setName("u1");
        User u2 = new User();
        u2.setName("u2");
        User u3 = new User();
        u3.setName("u3");

        Group g = new Group();
        g.setName("g1");
        g.getUsers().add(u1);
        g.getUsers().add(u2);
        g.getUsers().add(u3);
        //  如果不设置这个  group的id为null
        u1.setGroup(g);
        u2.setGroup(g);

        Session s = sessionFactory.getCurrentSession();
        s.beginTransaction();
        s.save(g);
        s.getTransaction().commit();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值