Spring JPA no @Transnational 保存 JpaRepository
Posted
技术标签:
【中文标题】Spring JPA no @Transnational 保存 JpaRepository【英文标题】:Spring JPA no @Transnational on save JpaRepository 【发布时间】:2019-03-27 19:08:12 【问题描述】:默认情况下,用户定义的存储库方法是只读的,修改查询被 @Transactional 覆盖,来自 Spring 的 SimpleJpaRepository 示例:
@Repository
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepository<T, ID>, JpaSpecificationExecutor<T>
*/
@Transactional
public <S extends T> S save(S entity)
if (entityInformation.isNew(entity))
em.persist(entity);
return entity;
else
return em.merge(entity);
我注意到 JpaRepository 没有用 @Transactional 覆盖保存:
@NoRepositoryBean
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T>
保存方法在CrudRepository
里面(这里没有跨国)
/**
* Saves a given entity. Use the returned instance for further operations as the save operation might have changed the
* entity instance completely.
*
* @param entity must not be @literal null.
* @return the saved entity will never be @literal null.
*/
<S extends T> S save(S entity);
那么在没有@Transnational 示例的情况下扩展 JpaRepository 时保存方法是如何工作的:
@Repository
public interface UserRepository extends JpaRepository<User, Long>
这里没有交易
@Override
public void test()
User user=new User();
user.setName("hello");
user.setLastName("hello");
user.setActive(1);
user.setPassword("hello");
user.setEmail("hello@hello.com");
userRepository.save(user);
【问题讨论】:
【参考方案1】:看看 SimpleJpaRepository。
https://github.com/spring-projects/spring-data-jpa/blob/master/src/main/java/org/springframework/data/jpa/repository/support/SimpleJpaRepository.java
这是默认的存储库实现,它显示了如何在从存储库接口生成的类中使用 @Transactional。
为什么你认为保存不是事务性的?
【讨论】:
我正在扩展 JpaRepository,它不会用 @transnational 覆盖保存。你的意思是它在实现而不是接口中被覆盖了吗? 你是对的,所有的存储库都是从这个类实现的以上是关于Spring JPA no @Transnational 保存 JpaRepository的主要内容,如果未能解决你的问题,请参考以下文章
Spring data JPA 理解(默认查询 自定义查询 分页查询)及no session 两种处理方法
Struts2 Spring JPA 整合时报错:No bean named 'entityManagerFactory' is defined ,请问各位是怎么解决
spring jpa使用@service注解时失效提示No bean named 'countryService' is defined