jpa hibernate延迟问题解决


如果出现org.hibernate.LazyInitializationException异常,no session orsession is closed,那是因为你使用了JPA或者hibernate的延时加载方法,并在访问对象的时候,session已经关闭。

方式一:在:web.xml中添加Filter
1:hibernate 解决( 方法(1)建立在未修改默认的sessionFactory<bean name>,如修改方法(2) )
   (1)
<filter>
        <filter-name>HibernateFilter</filter-name>
        <filter-class> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
        <filter-name>HibernateFilter</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>
(2)
<filter>
<filter-name>hibernateFilter</filter-name>
<filter class> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter </filter-class>
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>XXSessionFactory</param-value>
//默认是 <param-value>sessionFactory</param-value>
// XXSessionFactory为Spring配置文件中的sessionFactory对应的 
//<bean id="XXSessionFactoryclass ="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" >
</init-param>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

2:Jpa解决
   (1) <filter>
        <filter-name>SpringOpenEntityManagerInViewFilter</filter-name>
        <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>SpringOpenEntityManagerInViewFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping> 

方式二:
1:Jpa解决(jpa配置文件事务的配置,service主方法加@Transactional)
<!-- 配置 EntityManagerFactory -->
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<!-- 配置 JPA 提供商的适配器. 可以通过内部 bean 的方式来配置 -->
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"></bean>
</property>
<!-- 配置实体类所在的包 -->
<property name="packagesToScan" value="com.
X.X.X.bo"></property>
<!-- 配置 JPA 的基本属性. 例如 JPA 实现产品的属性 -->
<property name="jpaProperties">
<props>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
</props>
</property>
</bean>
<!-- 配置 JPA 使用的事务管理器 -->
<bean id="jpaTransactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"></property>
</bean>
<!-- 配置支持基于注解是事务配置 -->
<tx:annotation-driven transaction-manager="jpaTransactionManager"/>

懒加载详解
  1.  @OneToMany(fetch=FetchType.)的选项有,如下图:   
  2.         FetchType.EAGER:代表立即加载;   
  3.         FetchType.LAZY:代表延迟加载。   
  4.                
  5.     当我们把fetch设置为FetchType.LAZY的时候,什么时候初始化items里面的数据呢?当我们第一次访问这个属性,并对这个属性进行操作的时候,这个集合的数据才会从数据库里面load出来。但要注意:当我们访问这个延迟属性的时候,我们的前提要EntityManager这个对象没有被关闭,如果被关闭了我们再去访问延迟属性的话,就访问不到,并抛出延迟加载意外。   
  6.     如果没有设置fetch这属性的话,会怎么样呢?是立即加载?还是延迟加载呢?   
  7.     记住@OneToMany这个标签最后的英文单词,如果是要得到Many的一方,我不管你前面是什么,只要后面的单词是Many,也就是说要得到多的一方,你们就给我记住,默认的加载策略就是延迟加载(Many记录可能上几万条,立即加载的话可能对效率影响大,所以延迟加载)。   
  8.     反过来,如果后面是One呢?因为它是加载一的一方,这对性能影响不是很大,所以它的默认加载策略是立即加载。   
  9.        
  10.     mappedBy:我们怎么知道关系的维护端和被维护端呢?当然JPA规范规定多的一端应该是为维护端(关系维护段增加一个字段为外键,里面保存的是一的一端的主键),一的一端为关系被维护端,那么我们总要在程序里给他们打上标志吧?虽然规范是这么规定,但总要申明一下吧?就是通过mappedBy属性,只要哪个类出现了mappedBy,那么这个类就是关系的被维护端。里面的值指定的是关系维护端。   
  11.     orderItem这边由哪一个属性去维护关系呢?是OrderItem类的order属性。   
  12.     mappedBy属性对应Hibernate里面的inverse属性:<SET name="items" inverse="true"></SET>   
待完善........
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值