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)
中的方法JpaRepository
默认是事务性的(只读用于检索)。
现在在您的saveUser()
方法中,您需要@Transactional
,因为您正在检索User
并id
更新它,然后再次持久化到数据库。基本上,@Transactional(readOnly=true)
在阅读时使用,否则@Transactional
在 Spring Data JPA 中使用。
User user = userRepository.findById(id);
Run Code Online (Sandbox Code Playgroud)
如果没有找到用户,null
则返回并给出。user
user.setName("newname");
NullPointerException
归档时间: |
|
查看次数: |
3263 次 |
最近记录: |