保存JpaRepository时,Spring JPA没有@跨国

n3schb8v  于 2022-12-04  发布在  Spring
关注(0)|答案(2)|浏览(182)

默认情况下,用户定义的存储库方法是只读的,修改查询由@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);

在扩展JpaRepository而不使用@Transnational时保存方法如何工作示例:

@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);

    }
}
juud5qan

juud5qan1#

看一看SimpleJpaRepository。
https://github.com/spring-projects/spring-data-jpa/blob/master/src/main/java/org/springframework/data/jpa/repository/support/SimpleJpaRepository.java
这是默认的存储库实现,它显示了@Transactional如何在从存储库接口生成的类中使用。
为什么您认为保存不是事务性的?

rggaifut

rggaifut2#

对于有类似症状的人(JpaRepository.save无所事事):请检查配置中TransactionManager的实现。
事务联接逻辑不适用于DataSourceTransactionManager
我知道它可以与JpaTransactionManagerJtaTransactionManager一起工作;也许其他国家可以扩大这一清单。

相关问题