【问题标题】:How to exclude a method to be @Transactional?如何排除一个方法是@Transactional?
【发布时间】:2015-01-31 05:26:26
【问题描述】:

在服务层,我们得到了

@Service
@Transactional(readOnly = false)
public abstract class GenericService

在存储层,我们得到了

public abstract class GenericRepository

在服务中我们有一个save方法调用repository的save方法,就是

@Override
   public void savePersist(T entity) {

      getSession().persist(entity);
   }

我要做的就是将对象“实体”保存到休眠会话中以供进一步处理,而不需要提交或任何插入语句到数据库中。 但实际发生的是在运行 savePersist() 后保存“实体”。我认为这是因为在服务类上使用了 @Transactional 注释。但是我应该怎么做才能在会话中保存实体?

【问题讨论】:

  • 这是所有情况的理想行为还是仅适用于特定情况?在任何情况下,savePersist(T entity) 方法被指定用于保存和提交更改,因此如果您在特定情况下想要除此之外的行为,最好寻找其他解决方案。例如你可以有一些代理服务readOnly=true,它会调用GenericRepository.savePersist(T entity),结果spring会携带代理并且不会创建一个新的事务,所以实体不会被提交。

标签: java spring hibernate


【解决方案1】:

当您只想让 Spring 不提交事务时,您需要对事务进行角色回溯。有几种方法:

  • 抛出运行时异常(在具有 @Transactional 注释的方法内) - 但这有点滥用角色回馈机制
  • 另一种方法是将事务标记为readOnly@Transactional(readOnly = true)

但这两者都只适用于整个会话!

另一种方法是使实体只读:https://docs.jboss.org/hibernate/orm/3.5/reference/de-DE/html/readonly.html#readonly-api

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-23
    • 2011-09-07
    • 2012-07-10
    • 2021-01-01
    • 2019-03-30
    • 2022-01-23
    • 2015-05-27
    • 1970-01-01
    相关资源
    最近更新 更多