【问题标题】:JPA: The redundant save anti-patternJPA:冗余保存反模式
【发布时间】:2018-11-01 17:41:43
【问题描述】:

所以我有这个方法:

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

据此post

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 有什么区别?

【问题讨论】:

    标签: java hibernate jpa spring-data-jpa


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2022-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多