java - 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
在这种特定情况下使用或不使用有什么区别?
解决方案
在标准配置中,持久性上下文的范围绑定到事务。
如果您没有通过注释定义的显式事务,则您的(不存在的)事务仅跨越对数据库的读取调用。之后,刚刚加载的实体不受管理。这意味着对它的更改不会被跟踪或保存。冲洗无济于事,因为没有跟踪任何更改。
推荐阅读
- php - 来自 id 的显示名称给了我“试图获取非对象的属性 'proj_title'”
- node.js - 有什么方法可以从 URL 收集数据并在数据库中查找该数据并将其呈现在 ejs 文件中?
- json - 使用递归更改 json 中的值
- git - 使用 Git cli 配置 Git 2 因素身份验证令牌
- angular - 如何在角度选择器中检索和覆盖预设 chart.js 选项?
- svn - 如何从 subversion 包中加载所需的依赖项
- azure-active-directory - Microsoft Graph API:通过应用程序权限限制 calendar.readWrite 和审核邮箱访问范围
- php - 如何在php中扩展文本
- python - 随时间动态计算实体的出现次数
- python - python中的散点图密度来自csv中的数据