java - 如何将 @Transactional 与 Spring Data 一起使用?

标签 java spring jpa spring-data spring-data-jpa

我刚开始从事 Spring-data、Hibernate、MySQL、JPA 项目。我切换到 spring-data 这样我就不必担心手动创建查询了。

我注意到,当您使用 spring-data 时,不需要使用 @Transactional,因为我也尝试了没有注释的查询。

我应该/不应该使用 @Transactional 注释有什么具体原因吗?

作品:

@Transactional
public List listStudentsBySchool(long id) {
    return repository.findByClasses_School_Id(id);
}

同样有效:

public List listStudentsBySchool(long id) {
    return repository.findByClasses_School_Id(id);
}

最佳答案

您的问题实际上是关于什么的? @Repository 注释或 @Transactional 的用法。

@Repository 根本不需要,因为您声明的接口(interface)将由 Spring Data 基础架构创建并激活异常转换的代理支持。所以在 Spring Data 存储库接口(interface)上使用这个注解根本没有任何效果。

@Transactional - 对于 JPA 模块,我们在支持代理 ( SimpleJpaRepository ) 的实现类上有这个注释。这有两个原因:首先,持久化和删除对象需要 JPA 中的事务。因此,我们需要确保事务正在运行,我们通过使用 @Transactional 注释方法来做到这一点。

findAll()findOne(…) 等读取方法正在使用 @Transactional(readOnly = true),这不是绝对必要的,但触发事务基础结构中的一些优化(将 FlushMode 设置为 MANUAL 以让持久性提供程序在关闭 EntityManager 时可能跳过脏检查)。除此之外,该标志也在 JDBC 连接上设置,这会导致该级别的进一步优化。

根据您使用的数据库,它可以忽略表锁,甚至拒绝您可能意外触发的写入操作。因此,我们建议将 @Transactional(readOnly = true) 用于查询方法,您可以轻松地实现将注释添加到存储库接口(interface)。确保将纯 @Transactional 添加到您可能在该接口(interface)中声明或重新装饰的操作方法。

关于java - 如何将 @Transactional 与 Spring Data 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10394857/

相关文章:

java - 无法将参数添加到准备好的语句中。 JAVA。 Spring MVC

java - Hibernate 和 Spring,加载处于惰性模式的集合

java - Spring 安全 : Custom UserDetailsService not being called (using Auth0 authentication)

java - Hibernate 性能最佳实践?

java - Spring JPA、Hibernate中哪个类负责扫描@Entity注解?

java - 如何重置 ADF 表单中的 inputFile 控件?

java - 创建 jar 文件的最简单方法?

java.lang.IllegalArgumentException : Unable to locate persister

java - 在 Java 中将二进制转换为十进制

java - 使用 Apache Digester 从 xml 中读取数据