3

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

2 回答 2

3

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

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

 User user = userRepository.findById(id);

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

于 2013-09-18T17:37:20.317 回答
0

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

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

于 2013-09-16T23:20:26.557 回答