關於hibernate中cascade 和 fetch學習筆記

hibernate中 cascade是和增刪改有關的 而查的功能是和fetch有關的sql

  如下主要說下fetch的用法: session

    FetchType有EAGER和LAZY兩種 舉例來講 User類和Group類app

      User類中存在fetch

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

 

       Group類中存在代理

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

    多對一的雙向關聯 User是多的一方 Group是一的一方 hibernate默認多的一方的FetchType=EAGER 即取得User時默認取出對應的Groupget

    反之在Group默認的是FetchType=LAZY 默認不會取出 it

           在此同時討論下hibernate中的get 和load 主要講下load io

    hibernate在使用Session.load的時候 生成的是代理對象 不會發出sql語句 而是在使用的時候發出  例如:

public void testLoadUser() {
  
  testSaveGroup();
  
  Session s = sessionFactory.getCurrentSession();
  s.beginTransaction();
  User u = (User)s.load(User.class, 1);
  System.out.println(u.getName());
  s.getTransaction().commit();
 }

當u.getName時才發sql語句 可是若是這條語句放在 s.getTransaction().commit();以後執行 就會報no Session的錯誤 是由於實際代理對象發出sql語句的時候session已經關閉

相關文章
相關標籤/搜索