Hibernate 再接觸 CRUD

來源:互聯網
上載者:User

標籤:手動   hibernate   factory   不用   where   tor   ted   java   ash   

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.