Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将@Transactional与Spring数据一起使用?_Java_Spring_Jpa_Spring Data_Spring Data Jpa - Fatal编程技术网

Java 如何将@Transactional与Spring数据一起使用?

Java 如何将@Transactional与Spring数据一起使用?,java,spring,jpa,spring-data,spring-data-jpa,Java,Spring,Jpa,Spring Data,Spring Data Jpa,我刚开始从事Spring数据、Hibernate、MySQL和JPA项目。我切换到spring数据,这样就不用担心手工创建查询了 我注意到在使用spring数据时不需要使用@Transactional,因为我也尝试了不带注释的查询 我应该/不应该使用@Transactional注释的具体原因是什么 作品: @Transactional public List listStudentsBySchool(long id) { return repository.findByClasses_S

我刚开始从事Spring数据、Hibernate、MySQL和JPA项目。我切换到spring数据,这样就不用担心手工创建查询了

我注意到在使用spring数据时不需要使用
@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
注释


这是因为
@Repository
用于将未经检查的SQL异常转换为Spring exception,您应该处理的唯一异常是
DataAccessException

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

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

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

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


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

我认为这个问题有点大,不能在注释上减少我们需要考虑整个应用程序栈、我们想要应用的事务策略等等。Mark Richards在IBM开发人员网站上有一个非常全面的关于这个主题的文章集。您可以在这里找到第一个:


致以最诚挚的问候

我们还使用@Transactional annotation来锁定记录,以便另一个线程/请求不会更改读取。

因此,简而言之:我应该在所有DAO方法上的添加/编辑/删除查询上使用@Transactional,在选择查询上使用@Transaction(readOnly=true)。确切地说,最简单的方法是使用
@Transactional(readOnly=true)
在界面上(因为它通常包含大多数查找器方法),并用一个简单的
@Transactional
覆盖每个修改查询方法的此设置。这实际上是在
SimpleJpaRepositoy
@Oliver中完成的,感谢您的全面解释..但在浏览其他链接时[transaction pit falls]。它说“底线是,当您使用基于ORM的框架时,只读标志是毫无用处的,在大多数情况下会被忽略。但是如果您仍然坚持使用它,请始终将传播模式设置为SUPPORTS”。。阅读此内容后,我不确定是否应该使用(readOnly=true)单独使用..是否应始终与传播模式一起使用作为支持。在本文的这一部分中,几乎所有内容都是错误的。通过指出您没有编写,JDBC驱动的可以(将)提高数据库交互的性能。它还可以检测和拒绝意外发出的写入。除此之外,Spring在只读模式下禁用JPA/Hibernate刷新,这在您读取大型对象图时会极大地影响性能,因为提供程序不需要对其执行脏检查。该标志可能没有大的im虽然事务本身是一个协定,但它并不是所有需要考虑的问题。我可以证明在大型对象图或使用大量加载的托管对象的情况下的性能改进。在使用Spring时,这通常是正确的,但是因为Spring数据存储库已经被Spring代理支持了——使用@存储库DOE。没什么区别。