[Hibernate] - EAGER and LAZY

Hibernate中的字段映射中的Fetch有两种方式:EAGER和LAZYhtml

Eager:所有抓取数据库

Lazy:延迟抓取session

若是在字段中声明为Eager,那么在取得当前Bean时,同时会抓取Bean中的关联Bean值。即数据库查询屡次。反之Lazy则在以后抓取提交查询。app

 

好比,有以下声明为Eager的User Bean:fetch

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

此时使用Join查询时,将会同时把User bean下的cards均一同查询出来:spa

            // ----------------------------------------------------
            // 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:code

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

查询:htm

            // ----------------------------------------------------
            // 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";
相关文章
相关标签/搜索