当前位置: 首页 > 知识库问答 >
问题:

JPA:冗余保存反模式

冷浩瀚
2023-03-14

所以我有这个方法:

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

根据这篇文章:

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

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

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

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

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

共有1个答案

方和豫
2023-03-14

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

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

 类似资料:
  • Intel内存型号保证: 门店不会与其他门店一起重新订购 货物不会与其他货物一起重新订购 http://bartoszmilewski.com/2008/11/05/who-ordered-memory-fences-on-an-x86/ 我看到有人声称由于英特尔内存模型,SFENCE在x86-64上是多余的,但从来没有LFENCE。上述内存模型规则是否使任一指令冗余?

  • 问题内容: 我刚刚发现,浮动元素也会使其成为一个块,因此指定float属性和 display:block 是多余的。 (如果您尝试指定 display:inline 和 float:left 会发生什么?) 还有其他需要注意的冗余组合示例吗?块和宽度?等等, 有没有可以检查这种情况的工具? 问题答案: 我刚刚发现,浮动元素也会使它成为一个块,因此指定一个属性是多余的。 是的,如果已指定(或),则是

  • 在我的项目中,我需要使用谷歌api来收集一些计算的统计数据。如果您愿意,可以使用提供的链接找到原始的对象字段。 项目需要保留的数据比实际少得多。例如,我对下一个节点感兴趣: 或者 首先,我尝试使用graphql解决这个问题。我的第一个问题就在那里。我使用谷歌图书馆提供的类来避免重复。在节点成为映射之前,我为graphql指定了必需的对象描述。结果,我无法描述应该为我的请求过滤哪些映射键。关于指定问

  • 我正在审查OpenZeppelin的智能合约,在许多情况下,我发现往往存在冗余或重复的继承。 在本例中,ERC20实现了已经实现了IERC20的IERC20元数据。尽管如此,合同实现了这两个。我试着移除冗余接口,效果很好。这有什么原因吗?是否仅出于清晰或易读目的?

  • 我使用的是Eclipselink2.3.2提供的JPA2.0。 在这种情况下,可以通过在这两个表之间使用联接来更好地处理它,而不是使用子查询,但编写这样的子查询而不在其中使用冗余联接是可能的,因为这是一个相当基本的事情。 编辑1: 我看不出这个例外背后有什么理由。 编辑3: 在最新版本中的相同条件查询--在例外情况下失败的查询--在Hibernate(4.2.7 final)提供的JPA上没有任何

  • 问题内容: 有人可以给我一个SQL查询来帮助我清理此表吗?在清除locid(索引)后,应该重新设置,这是使用此查询的县城 。当我通过phpmyadmin的导入多次导入sql文本时,就会出现这种冗余数据,这就是结果, 问题答案: 在表位置添加唯一索引,这样就不会插入重复的记录 这将自动从表中删除重复的记录,对于以后的插入查询,您需要使用子句来避免出现重复的错误。 但正如注释中所建议的那样,它可能不适