繁体   English   中英

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

[英]Spring Data JPARepository and @Transactional For Multiple Operations inside One Method

当我在一个方法中进行多项操作时,saveUser方法不会保存用户对象名称更改。 如果我在saveUser服务方法的顶部使用@Transactional(propagation = Propagation.REQUIRED),它可以正常工作。 当另一个类创建一个新的User对象并设置其所有值并调用createUser方法时,它将正常工作。 为什么需要@Transactional作为saveUser方法? 在什么情况下我需要包含@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 /休眠Impl存储库:

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

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

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

 User user = userRepository.findById(id);

返回nulluser如果没有用户发现和user.setName("newname"); 将给出NullPointerException

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM