java - JPA:冗余保存反模式

标签 java hibernate jpa spring-data-jpa

所以我有这个方法:

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

根据这个post :

The save method serves no purpose. Even if we remove it, Hibernate will still issue the UPDATE statement since the entity is managed and any state change is propagated as long as the currently running EntityManager is open.

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

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

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

在此特定场景中使用或不使用 @Transactional 有什么区别?

最佳答案

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

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

关于java - JPA:冗余保存反模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53106556/

相关文章:

java - Java递归中找不到符号

java - 具有降序和升序的迭代器不起作用

java - 允许具有不同父类的类在没有多重继承的情况下扩展类

java - 使用setParameter或setParametrList删除数据HQL奇怪

java - Hibernate 每用户数据库

java - Hibernate 3.5-beta1 中的@ForeignKey

hibernate - Hibernate 和 JPA 有什么区别?

java - @ManyToMany JPA 2 复杂查询

java - 如何使用 aws-java-sdk 获取亚马逊网络服务中某个区域的所有可用图像的列表?

java - 类是托管的,但未在 persistence.xml 文件中列出