JPA:冗余保存反模式

所以我有这个方法:


@Transactional

public void savePostTitle(Long postId, String title) {

    Post post = postRepository.findOne(postId);

    post.setTitle(title);

}

根据这篇文章:


save 方法没有任何用处。即使我们删除它,Hibernate 仍然会发出 UPDATE 语句,因为实体是被管理的,并且只要当前运行的 EntityManager 处于打开状态,任何状态更改都会传播。


并且确实发出了更新语句,但是如果我在没有@Transactional注释的情况下运行该方法:


public void savePostTitle(Long postId, String title) {

        Post post = postRepository.findOne(postId);

        post.setTitle(title);

    }

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


@Transactional在这个特定场景中使用与不使用有什么区别?


慕妹3146593
浏览 176回答 1
1回答

浮云间

在标准配置中,持久化上下文的范围绑定到事务。如果您没有通过注释定义的显式事务,则您的(不存在的)事务仅跨越对数据库的读取调用。之后,刚刚加载的实体不受管理。这意味着不会跟踪或保存对其的更改。刷新无济于事,因为没有跟踪任何更改。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java