Spring Data JPARepository 和 @Transactional 用于一个方法内的多个操作

c12*_*c12 4 java spring jpa spring-data-jpa

当我在一个方法中有多个操作时,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

}
Run Code Online (Sandbox Code Playgroud)

春季服务:

@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);
  }
}
Run Code Online (Sandbox Code Playgroud)

Spring Data JPA/Hibernate Impl 存储库:

public interface UserRepository extends JpaRepository<User, Long> {
}
Run Code Online (Sandbox Code Playgroud)

The*_*ect 5

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

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

 User user = userRepository.findById(id);
Run Code Online (Sandbox Code Playgroud)

如果没有找到用户,null则返回并给出。useruser.setName("newname");NullPointerException