如何通过方法调用打开Hibernate中的急切初始化

时间:2014-07-14 15:18:50

标签: java spring hibernate

在hibernate中加载的默认实体设置为lazy。我希望在Hibernate中打开急切的初始化,只需要方法调用然后仍然使用延迟加载:

例如我有像:

这样的实体
 public class Applications  implements java.io.Serializable {


     private int id;
     private String name;
     private Set viewses = new HashSet(0); // here entities views
     private Set routeses = new HashSet(0);  // here antoher entities routes

     public Set getViewses() {
        return this.viewses;
     }

     public void setViewses(Set viewses) {
        this.viewses = viewses;
     }

     public Set getRouteses() {
        return this.routeses;
     }

     public void setRouteses(Set routeses) {
        this.routeses = routeses;
     }

     // .... other things

 } 

我想避免迭代所有内部对象以完全获取有关对象应用程序的所有详细信息例如:

        begin();
        List apps = getSession().createQuery("from Applications").list(); // here lazy initalisation not all inner elements are filled from database
        commit();

以上代码导致内部实体(如路线,视图)为空。 当我调用application.getRouteses()时,没有任何反应,因为我已将lazy设置为true并且我在会话关闭(commit)之后调用getRouteses()只能通过一个事务设置所有elementy在应用程序中并从方法返回它是使用迭代和设定者或渴望初始化:

        begin();
        List apps = getSession().createQuery("from Applications").list();
        Iterator iter = apps.iterator();
        while(iter.hasNext()){
            Applications application = (Applications) iter.next();
            application.setRouteses(application.getRouteses()); // here i set all routes beacuse i call getRoutes and hibernate will load from db
        }
        commit();

现在急于理解,下面的代码加载了有关内部路径和视图实体的对象的所有细节:

        begin();
        List apps = getSession().createQuery("from Applications").list(); // here eager all inner object are filled from databasse
        commit();

唯一的问题是懒惰变为急切但不在hibernate.xml配置中。我想知道有可能渴望一段时间,然后打开懒惰(programatical)。例如:

        // HERE LAZY INITIALISATION
        turnOnEager(); // some method ???

        // HERE EAGER INITIALISATION
        begin();

        List apps = getSession().createQuery("from Applications").list(); // here eager all inner object are filled from databasse
        commit();

        // AND LAZY AGAIN
        turnOnLazy(); // some method ???

1 个答案:

答案 0 :(得分:1)

您可能无法在运行时打开和关闭延迟。但是,您可以尝试使用 fetch 关键字更改hql以获取如下所示的子实体。

<强> HQL

from Applications a join fetch a.someProperty s join fetch s.anotherProperty

来自docs:

  

“fetch”连接允许值的关联或集合   使用单个选择与其父对象一起初始化。   这在集合的情况下特别有用。它   有效地覆盖了外连接和延迟声明   关联和集合的映射文件。

参考:http://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/queryhql.html