【发布时间】:2021-03-10 02:41:31
【问题描述】:
我正在为我的应用程序使用 Spring data JPA 的存储库。目前我正在使用 spring data jpa 存储库默认提供的基本 CRUD 操作,对于复杂的连接查询,我正在编写自定义 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);
}
在我的服务类中,我正在自动装配这个存储库并执行数据库操作。
@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。
- 我是否也应该用
Transactional(readOnly = true)标记read()方法?因为它只执行读取操作。 - 我是否也应该将
findContinent(Long id)标记为事务性(readOnly = true)?我读到所有默认方法都标记为 Transactional https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#transactions - 在存储库接口中,我应该在方法级别还是在接口级别标记Transactional注解。 (另外,我怀疑大多数自定义方法都是只读的)
- 在 Service 层和 Repository 层都有 @Transactional 好不好?
【问题讨论】:
标签: java hibernate jpa spring-data-jpa