Spring JPA 存储库事务性
Spring JPA repository transactionality
1 个关于 Spring JPA 存储库事务性的快速问题。
我有一个未标记为事务性的服务并调用 Spring JPA 存储库方法
userRegistrationRepository.deleteByEmail(email);
定义为
@Repository
public interface UserRegistrationRepository extends JpaRepository<UserRegistration, Long> {
UserRegistration findByEmail(String email);
void deleteByEmail(String email);
}
问题是它失败并显示“当前线程没有可用的实际事务的 EntityManager - 无法可靠地处理 'remove' 调用;嵌套异常是 javax.persistence.TransactionRequiredException”例外。
好的,我可以通过将服务 or deleteByEmail(..) 方法标记为事务来解决它,但我不能'不明白为什么它现在崩溃了。 Spring 文档明确指出“存储库实例上的 CRUD 方法默认是事务性的。”(http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#transactions),但显然这个不是……所以是此声明仅与 CrudRepository
?
的成员相关
ps:用于 Spring Data JPA 1.9.4
你是对的。默认情况下,只有 CRUD 方法(CrudRepository
方法)被标记为事务性的。
如果您使用自定义查询方法,您应该使用 @Transactional
注释明确标记它。
@Repository
public interface UserRegistrationRepository extends JpaRepository<UserRegistration, Long> {
UserRegistration findByEmail(String email);
@Transactional
void deleteByEmail(String email);
}
您还应该了解标记存储库接口方法而不是服务方法的后果。如果您使用默认事务传播配置 (Propagation.REQUIRED
),则:
The transaction configuration at the repositories will be neglected
then as the outer transaction configuration determines the actual one
used.
http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#transactions
如果您想了解有关其实现方式的更多信息,请查看默认的 CrudRepository
/ JpaRepository
实现 - SimpleJpaRepository
(您可能正在使用):
有趣的台词在这里:
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID> {
以及此处的一些交易方法:
@Transactional
public void deleteById(ID id) {
@Transactional
public <S extends T> S save(S entity) {
1 个关于 Spring JPA 存储库事务性的快速问题。 我有一个未标记为事务性的服务并调用 Spring JPA 存储库方法
userRegistrationRepository.deleteByEmail(email);
定义为
@Repository
public interface UserRegistrationRepository extends JpaRepository<UserRegistration, Long> {
UserRegistration findByEmail(String email);
void deleteByEmail(String email);
}
问题是它失败并显示“当前线程没有可用的实际事务的 EntityManager - 无法可靠地处理 'remove' 调用;嵌套异常是 javax.persistence.TransactionRequiredException”例外。
好的,我可以通过将服务 or deleteByEmail(..) 方法标记为事务来解决它,但我不能'不明白为什么它现在崩溃了。 Spring 文档明确指出“存储库实例上的 CRUD 方法默认是事务性的。”(http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#transactions),但显然这个不是……所以是此声明仅与 CrudRepository
?
ps:用于 Spring Data JPA 1.9.4
你是对的。默认情况下,只有 CRUD 方法(CrudRepository
方法)被标记为事务性的。
如果您使用自定义查询方法,您应该使用 @Transactional
注释明确标记它。
@Repository
public interface UserRegistrationRepository extends JpaRepository<UserRegistration, Long> {
UserRegistration findByEmail(String email);
@Transactional
void deleteByEmail(String email);
}
您还应该了解标记存储库接口方法而不是服务方法的后果。如果您使用默认事务传播配置 (Propagation.REQUIRED
),则:
The transaction configuration at the repositories will be neglected then as the outer transaction configuration determines the actual one used.
http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#transactions
如果您想了解有关其实现方式的更多信息,请查看默认的 CrudRepository
/ JpaRepository
实现 - SimpleJpaRepository
(您可能正在使用):
有趣的台词在这里:
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID> {
以及此处的一些交易方法:
@Transactional
public void deleteById(ID id) {
@Transactional
public <S extends T> S save(S entity) {