Java Spring @事务(Read Ont= True)上下文将数据提交到进程中间的DB中

Java Spring @事务(Read Ont= True)上下文将数据提交到进程中间的DB中,java,spring,hibernate,transactions,Java,Spring,Hibernate,Transactions,我正在做一项任务,使代码具有事务性。我有一段时间关于只读事务的问题,我在互联网上找到的任何一个建议都不起作用。Spring和hibernate集成项目 这是我的只读事务方法 @Transactional(propagation=Propagation.REQUIRES_NEW, readOnly=true ,rollbackFor=Exception.class) public void editInternationalExportConsigment(InternationalE

我正在做一项任务,使代码具有事务性。我有一段时间关于只读事务的问题,我在互联网上找到的任何一个建议都不起作用。Spring和hibernate集成项目

这是我的只读事务方法

@Transactional(propagation=Propagation.REQUIRES_NEW, readOnly=true 
,rollbackFor=Exception.class)
    public void 
editInternationalExportConsigment(InternationalExportConsignmentFormWrapper 
exportConssi (){}
在这个方法中,有一个翻译过程正在发生。其中,进程从数据库中获取select数据并设置为对象

  Contact contact =inquiry.loadCustomerContactById(consignmentVO.getCustomerContactId().intValue()); 

    if (contact != null && contact.getCity() != null) {
          consignment.setOrgin(contact.getCity().getCountry());
          consignment.setUniqueOriginCountry((contact.getCity().getCountry()!=null)?contact.getCity().getCountry().getId():null);
          consignment.setOrginCity(contact.getCity());
    }

中间没有任何更新或插入查询,只能选择。但在代码段执行结束时,它会将数据提交到DB,无论设置为setter方法的值将保留到DB中


有人能告诉我这里发生了什么事吗。您的反馈将非常感谢。

经过冗长的研究,我找到了答案。在我们的项目中,有两个会话工厂正在运行。它还使用SpringOpenSessionInviewFilter来避免“延迟初始化”问题。OpenSessionInViewFilter已将flushMode设置为自动。由于OpenSessionInViewFilter在整个过程中将hibernate会话绑定到线程,它将覆盖启动新事务后创建的事务性hibernate会话对象。因此,即使我将事务性作用域的flushmode保持为“提交”,它也会通过声明为OpenSessionInViewFilter的属性使用AUTO属性进行覆盖

当flushMode为AUTO hibernate时,会将脏对象刷新到DB。

作为解决方案,我在事务方法中手动将刷新模式更改为“提交”


谢谢大家的回复和评论

经过冗长的研究,我找到了答案。在我们的项目中,有两个会话工厂正在运行。它还使用SpringOpenSessionInviewFilter来避免“延迟初始化”问题。OpenSessionInViewFilter已将flushMode设置为自动。由于OpenSessionInViewFilter在整个过程中将hibernate会话绑定到线程,它将覆盖启动新事务后创建的事务性hibernate会话对象。因此,即使我将事务性作用域的flushmode保持为“提交”,它也会通过声明为OpenSessionInViewFilter的属性使用AUTO属性进行覆盖

当flushMode为AUTO hibernate时,会将脏对象刷新到DB。

作为解决方案,我在事务方法中手动将刷新模式更改为“提交”

谢谢大家的回复和评论