当前位置: 首页 > 知识库问答 >
问题:

Spring Data JPA+Hibernate将方法标记为事务性

解高昂
2023-03-14

我正在为应用程序使用Spring data JPA的存储库。目前,我正在使用spring data jpa存储库默认提供的基本CRUD操作,对于复杂的join查询,我正在编写定制的JPQL查询,如下所示:

public interface ContinentRepository extends JpaRepository<Continent, Long>
{
    @Query(value = "SELECT u FROM Continent u JOIN FETCH ... WHERE u.id = ?1")
    public List<Continent> findContinent(Long id);
}

在我的服务类中,我自动生成这个存储库并执行DB操作。

@Service
public class MyService
{
    @Autowired
    public ContinentRepository cr;

    public void read()
    {
        var result1 = cr.findContinent(1);
        var result2 = cr.findContinent(2);
    }


    @Transactional
    public void write()
    {
        var c = new Continent();
        // setters
        c = cr.save(c);
    }
}

目前,我只是将write()标记为org.springframework.transaction.annotation.transactional

  1. 我是否也应该将read()方法标记为transactional(readOnly=true)?因为它只执行读取操作。
  2. 我是否也应该将FindContinent(Long id)标记为事务性(readOnly=true)?我读到所有的默认方法都标记为事务性https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#transactions
  3. 在存储库接口中,我是应该在方法级别还是在接口级别标记事务性注释。(另外,我怀疑大多数自定义方法都是只读的)
  4. 在服务层和存储库层都使用@transactional是否好?

共有1个答案

涂煌
2023-03-14
  1. 我是否也应该用事务性(readOnly=true)标记read()方法?因为它只执行读取操作。

实际上并不需要,但是它可能会根据本博客https://vladmihalcea.com/spring-read-only-transaction-hibernate-optimization/创建一些关于缓存内存消耗的优化

与第一种情况相同的答案

一般来说,我添加到了方法级别,因为我对rollback等参数有更多的控制

我建议您在服务级别使用,因为在服务级别,您可以更新许多表(因此可以使用许多存储库),并且您希望您的整个更新都是事务性的。

 类似资料:
  • 问题内容: 我在正在使用的一个应用程序中使用Spring和Hibernate,但是在处理事务时遇到了问题。 我有一个服务类,该类从数据库中加载一些实体,修改它们的一些值,然后(当所有内容都有效时)将这些更改提交给数据库。如果新值无效(我只能在设置它们后检查),但我不想保留更改。为了防止Spring / Hibernate保存更改,我在方法中抛出异常。但是,这导致以下错误: 这是服务: 这就是我调用

  • 我在一个应用程序中使用Spring和Hibernate,我在处理事务时遇到了问题。 我有一个服务类,它从数据库加载一些实体,修改它们的一些值,然后(当一切都有效时)将这些更改提交给数据库。如果新值无效(我只能在设置它们后检查),我不想保留更改。为了防止Spring/Hibernate保存更改,我在方法中抛出一个异常。但是,这会导致以下错误: 这就是服务: 我就是这样调用它的: 我希望发生的事情是:

  • 我有一个应用程序通过jpa对各种数据库表进行大量写入。其中一个写入可能会导致乐观锁异常。如果抛出一个,没什么大不了的,我希望事务的其余部分提交。 我通过以下方式查看了Spring事务上的无回滚功能: 我的应用程序捕获了实体的合并方法周围的OLException,该方法将引发此异常,但事务仍会回滚。我做了一些挖掘,看看发生了什么,在JpaTransactionManager的doCommit方法中,

  • 我正在尝试创建一个事务方法,该方法调用其他几个事务方法以保存一些相互依赖的db实体。如果任何调用失败,我希望事务完全回滚。但是,这不是观察到的行为。这是我的代码: 也有and,但是当事务在第二次调用时失败时,第一个被提交。

  • 问题内容: 我有一个模型,该模型具有相当大的子实体图,并且hibernate最终制作了大约9条语句来懒惰地获取所有所需的数据,但是深度约4层时,出现“无法初始化代理- 没有会话”错误,我不知道为什么。 控制者 主持人 计划 计划明细 手册部分 例外 任何帮助,将不胜感激。 问题答案: 如果您希望保持 延迟加载 并且正在使用Spring Boot,只需在 application.properties

  • 我正在寻找一种不需要创建不同于其他方法的HibernateTransactionManager的解决方案。