JPA:冗余保存反模式

时间:2018-11-01 17:41:44

标签: java hibernate jpa spring-data-jpa

所以我有这个方法:

@Transactional
public void savePostTitle(Long postId, String title) {
    Post post = postRepository.findOne(postId);
    post.setTitle(title);
}

根据此post

  

保存方法没有任何作用。即使我们删除它,休眠   由于实体是受管理的,因此仍然会发出UPDATE语句,并且   只要当前正在运行,任何状态更改都将传播   EntityManager已打开。

确实发出了update语句,但是如果我运行的方法没有@Transactional批注:

public void savePostTitle(Long postId, String title) {
        Post post = postRepository.findOne(postId);
        post.setTitle(title);
    }

Hibernate不会发出更新语句,因此必须显式调用postRepository.save(post);

在这种特定情况下,是否使用@Transactional有什么区别?

1 个答案:

答案 0 :(得分:2)

在标准配置中,持久性上下文的范围绑定到事务。

如果您没有通过注释定义的显式事务,则您(不存在的)事务仅涉及对数据库的读取调用。 之后,不管理刚刚加载的实体。 这意味着将不会跟踪或保存对其所做的更改。 刷新无济于事,因为没有跟踪更改。