java - 如果一个类被标记为@Transactional,是否可以省略通常的事务管理样板代码?

标签 java hibernate spring

如果一个类被标记为@Transactional,这是否意味着样板文件:

Transaction tx = session.getTransaction();

  try {
   ...
   ...
   ...
   tx.commit();


  }

  catch (Exception e) {
   tx.rollBack();
  }

可以省略吗?我的基于 Hibernate 的代码当然可以在没有它的情况下工作。

编辑(跟进):那么为什么人们继续在他们的方法中编写样板,即使他们的类已经被注释了?

最佳答案

可以,只要

  1. 事务管理已正确配置,请参阅 13.3.3 Declarative transaction demarcation

  2. 对该方法的调用不会违反基于 AOP 的声明式事务管理的限制,请参阅 10.5.1 Understanding the Spring Framework's declarative transaction implementation (或者您使用 AspectJ 集成等高级功能来克服这些限制)。
    也就是说,对该方法的所有调用都是在从 Spring 获得的对象上执行的,并且不会从同一类的其他方法执行任何调用。

  3. Session 通过调用 SessionFactory.getCurrentSession() 在方法内部获得。

关于java - 如果一个类被标记为@Transactional,是否可以省略通常的事务管理样板代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7661122/

相关文章:

java - 如何检查 java 中的(未检查的)强制转换?

java - 避免 Android 中 EditText 的解析错误

json - 具有枚举键的 Map 的 GSON 自定义序列化器

java - 如何替换已经有一些 View 的fragment?

java - 是否可以将java类文件中的数据发送到node.js来显示

java - hibernate/JPA : Remove from multiple parents when child is deleted

Java 注解公共(public)/私有(private)范围

spring - 在Grails G-Func功能测试中引导 hibernate

java - Spring Boot + MySQL 社区服务器

java - Tomcat 和 SLF4J - 不将日志写入文件