当前位置: 首页 > 面试题库 >

Java / Hibernate-在只读模式下不允许写操作

蒋烨然
2023-03-14
问题内容

最近,我一直很烦人,但在Google和这个论坛上进行了一些研究之后,我仍然找不到能够解决我的问题的答案。

事情就是这样-有时,当我尝试使用hibernate更新或创建新对象时遇到以下错误:

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)
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
at org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:694)

真正奇怪的是,有时使用该方法更新对象getHibernateTemplate().saveOrUpdate(object);会起作用,但是有时使用相同的对象并通过调用相同的方法却无法起作用,但这似乎取决于我如何在对象中获取对象。第一名。

示例:假设我有一个包含3个字段的表:id,类型,长度。可能发生的是,如果我通过id获取对象并更新了长度,则它将起作用。如果按类型获取它并更新长度,则它将不起作用。因此,到目前为止,为避免出现问题,我一直在做的工作是,通过以后不会引起问题的方法来获取对象,但是尝试找到可行的方法变得越来越烦人。

另外,现在在尝试创建对象(但不是所有对象,仅在一个特定的表上)时出现此异常,并且找不到解决方法。我试图添加@Transactional(readOnly = false)事务,但是它没有做任何更改,并且显示模式是说我不是只读的。

有什么建议么?

编辑7月26日:这是与hibernate有关的一些配置

<property name="hibernateProperties">
    <props>
        <prop key="jdbc.fetch_size">20</prop>
        <prop key="jdbc.batch_size">25</prop>
        <prop key="cglib.use_reflection_optimizer">true</prop>
        <prop key="hibernate.show_sql">true</prop>
        <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
        <prop key="connection.autoReconnect">true</prop>
        <prop key="connection.autoReconnectForPools">true</prop>
        <prop key="connection.is-connection-validation-required">true</prop>
    </props>
</property>

另外,如果它可以帮助

<property name="transactionAttributes">
    <props>
        <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
        <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
        <prop key="execute*">PROPAGATION_REQUIRED</prop>
        <prop key="add*">PROPAGATION_REQUIRED</prop>
        <prop key="create*">PROPAGATION_REQUIRED</prop>
        <prop key="update*">PROPAGATION_REQUIRED</prop>
        <prop key="delete*">PROPAGATION_REQUIRED</prop>
    </props>
</property>

8月31日编辑:我的班级中扩展了HibernateDaoSupport,用于保存对象的相关代码是:

public void createObject(Object persisObj) {
    getHibernateTemplate().save(persisObj);
}

问题答案:

我从视图过滤器更改了单个会话属性。问题解决了:

  <filter>
    <filter-name>hibernateFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
    <init-param>
      <param-name>singleSession</param-name>
      <param-value>false</param-value>
    </init-param>
  </filter>


 类似资料:
  • 问题内容: 尝试将对象保存到数据库时遇到了以下错误。我尝试了here1和here2提到的解决方案,但是效果不好。我遵循的是一个教程,但唯一的区别是Spring和Hibernate的版本。 我可以直接使用SessionFactory持久化对象,但是如果我使用HibernateDaoSupport尝试使用此方法,它将失败并显示以下错误 spring.xml CustomerDAOImpl.java 使

  • 我正在使用Spring和Hibernate处理一个现有的项目,我感到困惑,因为我得到了一个 有一个服务层使用进行注释,还有一个方法,该方法应该是事务性的,因此它使用进行注释。对我来说,这意味着spring应该自己处理事务。 在中执行保存时会发生错误。它被注释为。 我认为,让spring在服务层为保存创建一个会话和一个事务,而在DAOs中,hibernate模板将获得spring管理的当前会话和事务

  • 我正在使用Spring和Hibernate处理一个现有的项目,我感到很困惑,因为我得到了一个 org.springframework.dao。InvalidDataAccessApiUsageException:只读模式下不允许写入操作(FlushMode.MANUAL):将会话转换为FlushMode。COMMIT/AUTO或从事务定义中删除“readOnly”标记。 尝试保存对象时出错,但我仍

  • 问题内容: 我正在尝试在用户空间中使用mmap读取“ mem_map”开始的物理内存。它是一个包含所有物理页面的数组。这是一台运行3.0内核的i386计算机。 代码是这样的: 我以此为根。输出为: 可以肯定的是,我搜索了问题并将以下行添加到我的/etc/sysctl.conf文件中: 但这也不起作用。 谁知道为什么不允许这样的mem_map操作,以及如何解决呢? 谢谢。 问题答案: 听起来好像内核

  • 嗨,我是java laungage一个有一个映射片段,如果我经常打开对话框并执行一些操作。我得到了 set_timerslack_ns写入失败:不允许操作 我已经尝试过这个解决方案,当运行地图活动时,应用程序崩溃,但问题是一样的。什么时候研发的,它显示在地图碎片上显示对话框导致了这个问题。有没有办法解决...?将标记添加到清单无法解决我的问题。

  • 当我试图打开索引时。php在浏览器中我看到错误: 在error.log: 2013/11/04 22:40:07[错误]3435#0:*4发送到stderr的FastCGI:“无法打开主脚本:/var/www/index.php(不允许操作)”,同时从上游读取响应头,客户端:10.0。2.2,服务器:localhost,请求:“GET/HTTP/1.1”,上游:fastcgi://127.0.0.