【问题标题】:Spring JPA no @Transnational on save JpaRepositorySpring JPA no @Transnational 保存 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);

    }
}

【问题讨论】:

    标签: hibernate spring-boot spring-data-jpa spring-repositories


    【解决方案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 覆盖保存。你的意思是它在实现而不是接口中被覆盖了吗?
    • 你是对的,所有的存储库都是从这个类实现的
    猜你喜欢
    • 1970-01-01
    • 2012-10-05
    • 2018-05-31
    • 2018-07-29
    • 2020-02-03
    • 2018-03-23
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多