1. 程式人生 > >Hibernate 再接觸 CRUD

Hibernate 再接觸 CRUD

必須 delete tom 方法 begin ger out add 註釋

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