[Hibernate] - EAGER and LAZY


Hibernate中的字段映射中的Fetch有兩種方式:EAGER和LAZY

Eager:全部抓取

Lazy:延遲抓取

如果在字段中聲明為Eager,那么在取得當前Bean時,同時會抓取Bean中的關聯Bean值。即數據庫查詢多次。反之Lazy則在之后抓取提交查詢。

 

比如,有如下聲明為Eager的User Bean:

    @OneToMany(mappedBy="user", cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    private Set<UserCard> cards;

此時使用Join查詢時,將會同時把User bean下的cards均一同查詢出來:

            // ----------------------------------------------------
            // Left join
            // ----------------------------------------------------
            String hql = "SELECT U FROM User U LEFT JOIN U.cards C WHERE U.userName=:userName AND C.cardID=:cardID";
            Query query = session.createQuery(hql);
            query.setLong("cardID", 1);
            query.setString("userName", "Robin");
            List<User> users = query.list();
            for (User user : users) {
                System.out.println("User ID:" + user.getUserID()
                        + "\tUser name:" + user.getUserName());
            }

輸出的SQL和查詢結果:

 

如果把Eager修改為Lazy:

    @OneToMany(mappedBy="user", cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    private Set<UserCard> cards;

查詢:

            // ----------------------------------------------------
            // Left join
            // ----------------------------------------------------
            String hql = "SELECT U FROM User U LEFT JOIN U.cards C WHERE U.userName=:userName AND C.cardID=:cardID";
            Query query = session.createQuery(hql); query.setLong("cardID", 1); query.setString("userName", "Robin"); List<User> users = query.list(); for (User user : users) { System.out.println("User ID:" + user.getUserID() + "\tUser name:" + user.getUserName()); }

輸出的SQL和查詢結果:


 

 

當然,大多數情況下,bean的設計都應該為Lazy

因為如果真要同步查詢得到關聯對象bean的值,可以在hql中加入FETCH關鍵字即可完成。

Fetch參考例子:http://www.cnblogs.com/HD/p/3957926.html

使用FETCH,如上查詢hql可以寫為:

String hql = "SELECT U FROM User U LEFT FETCH JOIN U.cards C WHERE U.userName=:userName AND C.cardID=:cardID";

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM