您的位置:澳门新葡8455最新网站 > 编程教学 > hibernate延迟加载org,Hibernate延迟加载

hibernate延迟加载org,Hibernate延迟加载

发布时间:2019-10-14 08:39编辑:编程教学浏览(163)

    public static void main(String[] args) {
     
      DeptEntity dept = getDept("402882e762ae888d0162ae888e420000");

    延迟加载在Hibernate中是默认延迟加载;

      //dept.getEmp()得到子表的记录集合
      System.out.println(dept.getEmp());

    测试代码一:

    }

    HibernateTest.java

    private static DeptEntity getDept(String did){
      Session session = sessionFactory.openSession();
      DeptEntity dept = (DeptEntity)session.get(DeptEntity.class, did);
      session.close();
      return dept;
    }

    代码:

     

    /**
     *
     */
    package com.b510.examples;

    运行结果:

    import java.util.Set;

    Exception in thread "main" org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.javakc.hibernate.onetomany.entity.DeptEntity.emp, could not initialize proxy - no Session
    at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:566)
    at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:186)
    at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:545)
    at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:124)
    at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:326)
    at java.lang.String.valueOf(String.java:2827)
    at java.io.PrintStream.println(PrintStream.java:771)
    at com.javakc.hibernate.onetomany.action.TestAction.main(TestAction.java:74)

    import org.hibernate.Session;

     

    /**
     *
     * @author XHW
     *
     * @date 2011-7-18
     *
     */
    public class HibernateTest {
     public static void main(String[] args) {
      new HibernateTest().update();
     }
     public void update(){
      Session session=HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();
      session.beginTransaction();
      Category category=(Category)session.get(Category.class, 1);
      System.out.println("id:"+category.getId()+"  ,name:"+category.getName()+", description:"+category.getDescription());
      
      Set<Product> products=category.getProducts();
      
      session.getTransaction().commit();  
     }
     
     
    }

    集合延迟加载初始化失败,不能初始化一个代理。就是集合在非一对一对象关系中,为了节省资源是默认延迟加载,而get方法又是非延迟加载,所以在执行完一次数据库查询后就执行session.close();关闭了session,而集合是延迟加载,在使用集合时再加载,此时session已经关闭,所以得不到代理。解决方法:可以在主表的hbm配置文件中,在<set>标签里设置lazy="false",集合就不延迟加载了,因此在执行get方法时,集合也获取到了,就不会出现延迟加载问题了。

    运行结果:

    log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
    log4j:WARN Please initialize the log4j system properly.
    Hibernate:
        select
            category0_.id as id1_0_,
            category0_.name as name1_0_,
            category0_.description as descript3_1_澳门新葡萄京娱乐场,0_
        from
            users.category category0_
        where
            category0_.id=?
    id:1  ,name:java, description:java好啊

    这里我们看到我们关心的是id,name和description属性,

    虽然有:  Set<Product> products=category.getProducts(); 代码,即:不处理集合对象。但是我们只要的是:

      System.out.println("id:"+category.getId()+"  ,name:"+category.getName()+", description:"+category.getDescription());
    输出的是id,name和description属性值,其他的我们不管,所以Hibernate用了lazy loading(延迟加载),带来的好处就是我们不关心的

    数据,不用现在加载,当我们要用的时候,才去加载

    测试代码二:

    HibernateTest.java

    代码:

    /**
     *
     */
    package com.b510.examples;

    import java.util.Set;

    import org.hibernate.Session;

    /**
     *
     * @author XHW
     *
     * @date 2011-7-18
     *
     */
    public class HibernateTest {
     public static void main(String[] args) {
      new HibernateTest().update();
     }
     public void update(){
      Session session=HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();
      session.beginTransaction();
      Category category=(Category)session.get(Category.class, 1);
      System.out.println("id:"+category.getId()+"  ,name:"+category.getName()+", description:"+category.getDescription());
      
      Set<Product> products=category.getProducts();
      for(Product product:products){
       System.out.println("ID:  "+product.getId()+"  name:"+product.getName()+" price: "+product.getPrice());
      }  
      session.getTransaction().commit();  
     }
     
     
    }

    运行效果:

    log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
    log4j:WARN Please initialize the log4j system properly.
    Hibernate:
        select
            category0_.id as id1_0_,
            category0_.name as name1_0_,
            category0_.description as descript3_1_0_
        from
            users.category category0_
        where
            category0_.id=?
    id:1  ,name:java, description:java好啊
    Hibernate: 
        select
            products0_.category_id as category2_1_,
            products0_.id as id1_,
            products0_.id as id0_0_,
            products0_.category_id as category2_0_0_,
            products0_.name as name0_0_,
            products0_.price as price0_0_,
            products0_.descripton as descripton0_0_
        from
            users.product products0_

        where
            products0_.category_id=?
    ID:  1  name:java SE应用程序设计 price: 78.00
    这里可以明确的告诉我们,当我们要加载Set集合的时候,这时候才去加载,而上面的例子,说明的是我们不加载的时候

    Hibernate就延迟加载

    取消延迟加载:

    Category.hbm.xml

    代码:

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "">
    <!--
        Mapping file autogenerated by MyEclipse Persistence Tools
    -->
    <hibernate-mapping>
        <class name="com.b510.examples.Category" table="category" catalog="users">
            <id name="id" type="java.lang.Integer">
                <column name="id" />
                <generator class="increment" />
            </id>
            <property name="name" type="java.lang.String">
                <column name="name" length="500" />
            </property>
            <property name="description" type="java.lang.String">
                <column name="description" length="500" />
            </property>
            <set name="products" inverse="true" lazy="false">
                <key>
                    <column name="category_id" />
                </key>
                <one-to-many class="com.b510.examples.Product" />
            </set>
        </class>
    </hibernate-mapping>

    测试代码:

    HIbernateTest.java

    代码:

    /**
     *
     */
    package com.b510.examples;

    import java.util.Set;

    import org.hibernate.Session;

    /**
     *
     * @author XHW
     *
     * @date 2011-7-18
     *
     */
    public class HibernateTest {
     public static void main(String[] args) {
      new HibernateTest().update();
     }
     public void update(){
      Session session=HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();
      session.beginTransaction();
      Category category=(Category)session.get(Category.class, 1);
      System.out.println("id:"+category.getId()+"  ,name:"+category.getName()+", description:"+category.getDescription());
      
      Set<Product> products=category.getProducts();
       
      session.getTransaction().commit();  
     }
     
     
    }

    运行效果:

    log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
    log4j:WARN Please initialize the log4j system properly.
    Hibernate:
        select
            category0_.id as id1_0_,
            category0_.name as name1_0_,
            category0_.description as descript3_1_0_
        from
            users.category category0_
        where
            category0_.id=?
    Hibernate:
        select
            products0_.category_id as category2_1_,
            products0_.id as id1_,
            products0_.id as id0_0_,
            products0_.category_id as category2_0_0_,
            products0_.name as name0_0_,
            products0_.price as price0_0_,
            products0_.descripton as descripton0_0_
        from
            users.product products0_
        where
            products0_.category_id=?
    id:1  ,name:java, description:java好啊
    和测试代码一的运行结果相互比较,我们会发现,这次运行结果用了两条select语句。但是我们会发现

    第二条select语句,对于我们的需求是没有必要的,他只有一个用处就是占用我们的程序执行时间。当然,

    这是我们不希望看到的结果。

    一般情况下,Hibernate会默认给我们设置延迟加载。lazy="true" ,这样会提升我们的系统性能,所以一般情况下,我们不会去

    设置lazy="false",当然在特殊的情况下,我们必须要取消延迟加载的时候,我们就把lazy="false",就可以了

    本文由澳门新葡8455最新网站发布于编程教学,转载请注明出处:hibernate延迟加载org,Hibernate延迟加载

    关键词:

上一篇:Redis面试总结

下一篇:没有了