0

我的 Webapp 中有以下 JSF 支持 bean

@ManagedBean
class MyBackingBean implements Serializable {

    private MyHibernateRepository repository;
    ...

    @Transactional 
    public void save() {
        ....
        repository.save(myObject);
    }

}

当它到达repository.save方法调用时 - 我收到以下错误

no transaction is in progress

我有两个问题

  1. 这是因为这样的错误
  2. 我相信有两种解决方法 - 还有其他方法吗?

2.1 第一个解决方法 - 使用

transactionTemplate.execute(new TransactionCallbackWithoutResult() {
  protected void doInTransactionWithoutResult(TransactionStatus status) {
    repository.save(myObject);
  }
});

2.2 第二种解决方法

创建一个辅助类并对其进行注释。

2.3(可能的第三种解决方法是在内部类的方法上注释 @Transactional 这与 2.2 非常相似)。

4

1 回答 1

2

当使用 Spring 注释时(我知道这@Transactional是 Sun 标准 - 但您需要一个实现) - Spring 使用 AOP 对类进行注释以添加事务处理代码。这仅适用于 Spring bean。如果您的类是 JSF 的支持 bean - Mojarra 框架不会将其自己的事务处理代码插入到此注释中。

简短的回答 -@Transactional适用于 Spring 加载的 bean。否则你需要找到一个支持它的框架或者假设它不起作用。

于 2012-05-06T23:39:23.720 回答