[英]Spring Data JpaRepository saveAndFlush not working in @Transactional test method
[英]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);
返回null
到user
如果没有用户发现和user.setName("newname");
将给出NullPointerException
。
如果您更新数据库状态(插入/更新/删除),则需要进行事务处理,否则最终将出现这种行为。
即使您在方法中执行只读操作,也应使用@Transactional(readOnly=true)
对其进行注释,以便Spring可以优化事务性资源。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.