【问题标题】:Best practice for safely persisiting new JPA enities with generated Ids使用生成的 Id 安全持久化新 JPA 实体的最佳实践
【发布时间】:2012-07-30 08:43:41
【问题描述】:

从用户输入创建新实体时,我无法确定没有其他实体具有相同的数据。我能找到的唯一示例使用了预定义的 ID,因此可以通过调用 entityManager.find(id) 来检查实体是否存在。如果生成了 id,我看到了几种安全持久的方法:

  • 致电 entityManager.persist 并希望最好 - 抓住 EntityExistsException 并吞下它或显示错误消息
  • 致电entityManager.merge 并让JPA 进行检查...它会一直正常工作吗?
  • 通过查询搜索实体 - jPQL 或条件,如果找不到,请调用 entityManager.persist

我的直觉是采用第三种方法,但还有更好的方法吗?

我正在使用 JPA 2,并希望避免使用特定于供应商的解决方案(例如 Hibernate 的SessionManager.saveOrUpdate

【问题讨论】:

  • “生成的ID”是指用户生成的ID?为什么不使用合成 ID?
  • @Tichodroma - 不,我的意思是用 @GeneratedValue 注释的 ID。

标签: java jpa jpa-2.0


【解决方案1】:

如果您真的无法预测新生成的 ID 是否唯一,我肯定会采用第三种方法。

另外,我认为您不需要 Criteria 来进行如此简单的查询,而且在大多数情况下,额外查询的成本不会很高。

【讨论】:

  • 谢谢,fvu。我可以肯定,一旦生成,ID 将是唯一的。我不能确定不违反价值观的唯一性约束。所以EntityExists 可能不是抛出的异常。
猜你喜欢
  • 2012-08-09
  • 1970-01-01
  • 2011-06-04
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 2021-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多