`

Spring+hibernate延迟加载报错解决办法之二

阅读更多

在做删除操作的时候出现了org.springframework.dao.InvalidDataAccessApiUsageException异常.

org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
	at org.springframework.orm.hibernate3.HibernateTemplate.checkWriteOperationAllowed(HibernateTemplate.java:1186)
	at org.springframework.orm.hibernate3.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:696)
	at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
 .............................(代码偏长,余下的省略掉)

 在项目中使用Spring+Hibernate的时候,会开启OpenSessionInViewFilter来阻止延迟加载的错误,但是在我们开启OpenSessionInViewFilter这个过滤器的时候FlushMode就已经被默认设置为了MANUAL,如果FlushMode是MANUAL或NEVEL,在操作过程中 hibernate会将事务设置为readonly,所以在增加、删除或修改操作过程中会出现如下错误
org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition;
解决办法:直接修改OpenSessionInViewFilter过滤器的配置,配置过滤器的时候配置就是在一般的配置里面加上

 

  <init-param>
            <param-name>flushMode</param-name>
            <param-value>AUTO</param-value>
        </init-param>

 

,直接指定flushMode的配置就OK了: 具体如下

 <filter>
        <filter-name>hibernateFilter</filter-name>
        <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
     <init-param>
            <param-name>flushMode</param-name>
            <param-value>AUTO</param-value>
        </init-param>
        <init-param>
            <param-name>singleSession</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>hibernateFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

 

 

分享到:
评论

相关推荐

    hibernate 中 fetch=FetchType.LAZY 懒加载失败处理方法

    Hibernate 中 fetch=FetchType.LAZY 懒加载失败处理方法可以通过使用 OpenSessionInViewFilter 或者 Hibernate 的 initialize 方法来解决。这些方法可以确保 Hibernate 的懒加载特性能够正常工作,从而提高应用程序...

    java必备知识点大全.pdf

    Hibernate中get和load的区别:get是立即加载,load是延迟加载。 Hibernate、Ibatis、Jdbc三者的区别:Hibernate和Ibatis都是JDBC的封装框架,但Hibernate是全自动的ORM映射,而Ibatis是半自动的。 Hibernate的运行...

    javaehache

    Java Ehcache 是一款高效、流行的开源缓存解决方案,主要用于提高应用程序的性能和响应速度。它在Java应用程序中扮演着至关重要的角色,通过存储经常访问的数据,避免了每次请求时都去数据库或者其他慢速数据源中...

    自整理Java关于基础和框架的面试题

    - **load**:延迟加载,如果找不到对象返回`null`。 ##### Hibernate、Ibatis、Jdbc三者的区别 - **Hibernate**:全ORM框架,简化了数据持久化操作。 - **iBatis**(MyBatis):半ORM框架,需要手动编写SQL语句。 -...

    reflect-learn

    这种机制允许我们延迟加载某些不常用的类或者处理未知类型的对象。JVM提供`ClassLoader`类来实现动态加载,只有在实际需要使用某个类时,才会尝试加载它。即使类不存在,编译期间也不会报错,但会在运行时抛出异常。...

    java面试知识

    - **load**:延迟加载对象,如果找不到记录,则返回null。 ##### Hibernate、Ibatis、Jdbc三者的区别 - **Hibernate**:全ORM解决方案,自动管理对象的生命周期。 - **MyBatis (原Ibatis)**:半ORM框架,提供动态...

Global site tag (gtag.js) - Google Analytics