java - Spring 事务管理的问题?

标签 java spring hibernate

我正在使用 spring 和 hibernate。我正在使用 spring 进行事务管理。我有下面的课。

@Service
@Transactional(readOnly = true)
public class Sample implements SampleInterface{

@Override
public List<Some> getData(){

//gets data after that it updates something

setStatus(someId);

}

@Override
@Transactional
public void setStatus(Long someId){

//sets status

}

}

如果我不为 getData() 保留 @Transactional,那么我会遇到以下异常。

Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode

如果我为 getData() 保留 @Transactional,那么它将正确保存。这里有什么问题?任何我如何为setStatus()设置@Transactional。我仍然需要为 getData() 保留 @Transactional,因为它正在调用将设置状态的公共(public)方法吗?

谢谢!

最佳答案

问题有点复杂,是调用setStatus() 里面 getData()引起的。当您从外部调用 getData() 时,您实际上是在调用 Spring 框架为您创建的 Java 代理。此代理应用事务行为(启动只读事务)并委托(delegate)给您的实际服务类。这很好用。

但是,当您调用 setStatus() 时,您将绕过事务代理并直接调用您的服务。换句话说,对 setStatus() 的请求不会被拦截,并且 @Transactional 会被忽略

没有简单的方法来处理这个问题并且有同样的问题。在同一个类中调用公共(public)方法时,您必须格外小心。

另见

关于java - Spring 事务管理的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11950895/

相关文章:

java - 如何在 JPA 2.0 元模型中自动生成列名作为静态最终字符串?

spring - 如何在 Siteminder 的 Spring Security 预身份验证中验证 SM_USER header

java - bean 中的 Spring JavaConfig 属性未设置?

java - 在 GitHub 上公开时隐藏字符串 <property name ="password"value ="***"/>?

java - Hibernate select id of join column without join

java - Spring Rest 模板用 Spock 进行模拟

java - 反序列化时需要一个列表,但得到了一个类 java.util.HashMap

java - 线程 "main"org.openqa.selenium.NoSuchElementException : Unable to locate element://*[@id ='login-email' ] 中的异常

oracle - hibernate 重复查询

java - 如何在 hibernate 中映射自动增量字段?