【问题标题】:Spring Data JPARepository and @Transactional For Multiple Operations inside One MethodSpring Data JPARepository 和 @Transactional 用于一个方法中的多个操作
【发布时间】:2013-09-21 05:26:52
【问题描述】:

当我在一个方法中有多个操作时,saveUser 方法不会保存用户对象名称更改。如果我在 saveUser 服务方法之上使用 @Transactional(propagation = Propagation.REQUIRED) ,它工作正常。当另一个类创建一个新的 User 对象并设置其所有值并调用 createUser 方法时,它可以正常工作。为什么 saveUser 方法需要 @Transactional?在什么情况下我需要包含@Transactional?我正在使用 Spring Data 和 JPA (Hibernate impl)。有什么想法吗?

JPA 实体:

@Entity
public class User{
    @Id
    @GeneratedValue
    private Long id;
    @Column
    private String name;

//getters/setters..etc

}

春季服务:

@Service
public class UserServiceImpl{
  @Autowired
  UserRepository userRepository;

  public void saveUser(Long id){
      User user = userRepository.findById(id);
      user.setName("newname");
      userRepository.save(user);
  }

  public void createUser(User user){
      userRepository.save(user);
  }
}

Spring Data JPA/Hibernate Impl 存储库:

public interface UserRepository extends JpaRepository<User, Long> {
}

【问题讨论】:

  • 只是出于好奇,出了什么问题?

标签: java spring jpa spring-data-jpa


【解决方案1】:

JpaRepository 中的方法默认是事务性的(检索时只读)。

现在在您的saveUser() 方法中,您需要@Transactional,因为您正在通过id 检索User 并对其进行更新,然后再次持久化到数据库中。基本上,@Transactional(readOnly=true) 在阅读时使用,否则 @Transactional 在 Spring Data JPA 中使用。

 User user = userRepository.findById(id);

如果没有找到用户,则返回 nulluseruser.setName("newname"); 将返回 NullPointerException

【讨论】:

  • "readonly for retrieving" - 我认为这是假设持久性上下文的范围本身就是事务性的。如果要扩展的 JpaRepository 集使用的 EntityManager 实例的持久性上下文,实体将保持连接状态。
  • 我个人认为问题中的代码应该可以正常工作。 JpaRepository 的 save 方法使用 P.Context 中的实体(如果存在),如果不存在,它会通过实体的 Id 进行选择以将其带入上下文。然后它进行更新,并且由于默认情况下保存方法是事务性的,因此当事务完成时进行提交并在数据库中刷新。如果 saveUser 方法带有 @Transactional 注释,则两个操作将共享 P. 上下文,并且不需要进行选择以将实体带入上下文。
【解决方案2】:

如果您更新数据库状态(插入/更新/删除),您需要事务,否则您最终会出现这种行为。

即使您在方法中执行只读操作,也应该使用 @Transactional(readOnly=true) 注释它们,以便 Spring 可以优化事务资源。

【讨论】:

    猜你喜欢
    • 2020-06-24
    • 2021-12-21
    • 1970-01-01
    • 2018-02-17
    • 2017-08-12
    • 2016-10-04
    • 1970-01-01
    • 2016-08-15
    • 2018-07-25
    相关资源
    最近更新 更多