栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何使用Spring Data JPA保存具有手动分配的标识符的实体?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何使用Spring Data JPA保存具有手动分配的标识符的实体?

基本上,您正在从自动分配的标识符切换到手动定义的标识符,这对JPA和Spring Data级别都有很多影响。

数据库操作时间

在普通的JPA级别,持久性提供程序不必立即执行单个插入,因为它不必获取标识符值。这就是为什么它通常会延迟语句的执行,直到需要刷新为止(这是对的显式调用

EntityManager.flush()
,即查询执行),因为这要求数据库中的数据是最新的以提供正确的结果或事务提交。

Spring Data
JPA存储库会在调用时自动使用默认事务

save(…)
。但是,如果您
@Transactional
在依次注释的方法中调用存储库,则直到离开该方法,数据库交互才可能发生。

EntityManager.persist(…)
VS。
….merge(…)

JPA要求

EntityManager
客户代码区分保留一个全新实体或对现有实体进行更改。Spring
Data存储库希望将客户端代码从不必处理这种区别中解放出来,因为业务代码不应因实现细节而过载。这意味着,Spring
Data必须以某种方式将新实体与现有实体区分开。参考文档中描述了各种策略。

如果是手动标识符,则默认情况下

null
将不检查标识符属性的值,因为
null
根据定义,该属性永远不会。一种标准模式是调整实体以实现
Persistable
并保持一个短暂的is-
new-flag,并使用实体回调注释来翻转该标记。

@MappedSuperclasspublic abstract class AbstractEntity<ID extends SalespointIdentifier> implements Persistable<ID> {  private @Transient boolean isNew = true;  @Override  public boolean isNew() {    return isNew;  }  @PrePersist  @PostLoad  void markNotNew() {    this.isNew = false;  }  // More pre…}

isNew
声明为瞬态的,这样它就不会持久。该类型实现,
Persistable
以便存储库
save(…)
方法的Spring Data
JPA实现将使用该类型。上面的代码使用
new
标记设置为
true
,从用户代码创建实体,但是任何类型的数据库交互(保存或加载)都会将该实体转换为现有实体,因此
save(…)
将在
EntityManager.persist(…)
最初触发但
….merge(…)
为所有后续操作触发。

我借此机会创建了DATAJPA-1600,并将此描述的摘要添加到了参考文档中。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/635719.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号