【问题标题】:Transactional annotation different behavior事务注释不同的行为
【发布时间】:2013-12-03 14:09:50
【问题描述】:

我刚刚看到了两个不同的项目。

当您尝试从没有@Transactional 注释的方法中持久化/保存实体时,其中之一会出现异常:No session found

另一方面

即使不存在@Transactional 注释,save 方法也允许保存。

PS - 一个项目使用 Spring + Hibernate(session not found 例外),另一个使用 Spring + JPA + Spring Data 存储库(允许在没有事务注释的情况下保存)

任何想法为什么会出现差异?最佳做法是什么?

【问题讨论】:

  • 您确定在第二个项目的调用堆栈中某处没有@Transactional 方法吗?它是被方法调用包裹的通知,因此如果仅从具有通知的其他方法调用持久性方法,则它本身不必具有注释。
  • 很确定,仔细检查一下
  • 你检查过课堂上是否有@Transactinal注解吗?如果一个类被注释为事务性的,这会影响该类的所有方法。
  • 或者通过 AOP 进行交易?
  • 也许在 JPA 项目中,事务是在 spring 上下文中声明的。在上下文中搜索 txManager(例如 JpaTransactionManager)并跟踪它的使用情况...

标签: java spring hibernate jpa transactional


【解决方案1】:

这是因为,正如 Spring Data JPA 的 the documentation 所指出的那样

默认情况下,存储库实例上的 CRUD 方法是事务性的。对于读取操作,事务配置 readOnly 标志设置为 true,所有其他都配置有纯 @Transactional 以便应用默认事务配置。详情参见Repository的JavaDoc。

【讨论】:

    猜你喜欢
    • 2014-09-23
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多