Hibernate 再接触 CRUD

Posted Blueburble

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate 再接触 CRUD相关的知识,希望对你有一定的参考价值。

1.save 一对多双向

package com.bjsxt.hibernate;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name="t_group")
public class Group {
    private int id;
    private String name;
    private Set<User> users = new HashSet<User>();
    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @OneToMany(mappedBy="group"}    //只要是增删改查都自动保存
        )
    
    public Set<User> getUsers() {
        return users;
    }
    public void setUsers(Set<User> users) {
        this.users = users;
    }
}

 

Group.java

package com.bjsxt.hibernate;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name="t_user")
public class User {
    private int id;
    private String name;
    private Group group;
    @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;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

test

@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(g);   //如果设置了Csadtype 可以不用先保存g
        s.save(u);
        s.getTransaction().commit();
    }
    

cascade管增删改 fetch管读
从多的一方取 会自动取出少的一方的信息
从少的一方取 不会默认取出多的一方的值 要设置fatch属性为FatchType.EAGER才可以
存少的一方
比如存group
group.java 其他不改
package com.bjsxt.hibernate;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name="t_group")
public class Group {
    private int id;
    private String name;
    private Set<User> users = new HashSet<User>();
    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    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;
    }
}

test

@Test
    public void testSaveGroup() {
        User u1 = new User();
        u1.setName("u1");
        User u2 = new User();
        u2.setName("u2");
        Group g = new Group();
        g.setName("g1");
        g.getUsers().add(u1);
        g.getUsers().add(u2);
        u1.setGroup(g);    //必须手动设用户的id号 否则数据库为空值
        u2.setGroup(g);   
        Session s = sessionFactory.getCurrentSession();
        s.beginTransaction();
        //s.save(g);
        s.save(g);
        s.getTransaction().commit();
    }

 

获取到user的时候会默认吧group取出来(1那方)
    @Test
    public void testGetUser() {
        
        testSaveGroup();
        
        Session s = sessionFactory.getCurrentSession();
        s.beginTransaction();
        User u = (User)s.get(User.class, 1);
        
        s.getTransaction().commit();
        System.out.println(u.getGroup().getName());
    }

即便去除点cascade也会取掉

测试 取一的地方是否把多的地方取出来? 不会

 

这样就可以把多的一方也取出来了 
当设置多的一方fatch为lazay的时候 hibernate便不自己取出少的一方了
@Test
    public void testGetUser() {
        
        testSaveGroup();
        
        Session s = sessionFactory.getCurrentSession();
        s.beginTransaction();
        User u = (User)s.get(User.class, 1);
        //放在这里是可以的 会拿出来一的那一方
        s.getTransaction().commit();
        System.out.println(u.getGroup().getName());  //取不出来
    }

 

如果在一的地方取 因为fatch为eager已经自动查出来了 不需要在和数据库打交道了

测试load方法
@Test
    public void testLoadUser() {
        
        testSaveGroup();
        
        Session s = sessionFactory.getCurrentSession();
        s.beginTransaction();
        User u = (User)s.load(User.class, 1);//返回代理对象
        System.out.println(u.getGroup().getName());  //这句话发出两个select
        s.getTransaction().commit();
        
    }

如果设置fatch为lazy 在找这个对象的时候就不会自动再去找关联的那一方 但是在找另外一方的时候如果是fatch为eager 则又会发出select语句。

update

    @Test
    public void testUpdateUser() {
        
        testSaveGroup();
        
        Session s = sessionFactory.getCurrentSession();
        s.beginTransaction();
        User u = (User)s.get(User.class, 1);  //如果user设置为fetch为lazy 则只拿出user 若是eager 则group也拿出来了
        
        s.getTransaction().commit();   //变为detach态
        
        u.setName("user");         //更改名字 缓存中有对象
        u.getGroup().setName("group");  //拿到group 可见这里的fetch是eager
        
        Session s2 = sessionFactory.getCurrentSession();
        s2.beginTransaction();  
        s2.update(u);      //更改了u  
        
        s2.getTransaction().commit();  //提交
    }
    

 

删除
删除多的一方
@Test
    public void testDeleteUser() {
        
        testSaveGroup();
        
        Session s = sessionFactory.getCurrentSession();
        s.beginTransaction();                           
        //User u = (User)s.load(User.class, 1);   //注释的内容先吧这个对相对应的group设置为null 然后再删除 防止因为删除user 导致删除group 从而删除另外的User
        //u.setGroup(null);             //也可以用HQL语句 如下所示
        //s.delete(u);                  //也可以设置cascade为非删除
        s.createQuery("delete from User u where u.id = 1").executeUpdate();   
        s.getTransaction().commit();
        
    }

 

删除少的一方

 

一般来说

删除少的一方

@Test
    public void testDeleteGroup() {
        
        testSaveGroup();
        
        Session s = sessionFactory.getCurrentSession();
        s.beginTransaction();
        //User u = (User)s.load(User.class, 1);
        //u.setGroup(null);
        //s.delete(u);   //这样会使得user里没有groupid
        Group g = (Group)s.load(Group.class, 1);
        s.delete(g);     //这样回导致删除group以及对应其id的user
        //s.createQuery("delete from User u where u.id = 1").executeUpdate();  //使用HQL语句
        s.getTransaction().commit();
        
    }

 


以上是关于Hibernate 再接触 CRUD的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate 再接触 核心开发接口

Hibernate 再接触 总结

Hibernate 再接触 基础配置 续

Hibernate 再接触 事务隔离机制

java之hibernate之crud

Hibernate中的CRUD操作