【问题标题】:Java JPA handle a 'create' with unique constraint violationJava JPA 处理具有唯一约束冲突的“创建”
【发布时间】:2020-07-16 14:51:53
【问题描述】:

我正在使用 SpringBoot 和 JPA(带有 Hibernate)。

我们可以假设在一个实体上我有一些独特的约束(例如,一个以电子邮件为约束的用户实体)。

当我将收到“创建”请求时,如果资源已经存在,我必须返回已经存在的资源的主键(例如 ID,而不是电子邮件)。

最好的做法是什么?

我想避免 2 个查询(一个用于检查是否存在,一个用于创建),这可能吗?

【问题讨论】:

标签: java sql hibernate jpa


【解决方案1】:

JPA 并没有真正提供任何用于唯一约束违规分析的 API。唯一约束冲突是一个低级别的特定于数据库的错误,通常只包含表和字段信息。只是没有足够的数据将其传播到业务级别(获取实体和 ID 信息)。

我知道的最佳做法是手动检查具有此类字段值的实体是否已存在。唯一约束当然应该仍然存在,仅用于非常罕见的并发插入情况。

例如,如果您使用 Spring Data JPA,您可以通过以下存储库查询获取现有用户的 id:

@Query("SELECT u.id FROM User u WHERE u.email = :email")
Long getUserIdByEmail(@Param("email") String email);

【讨论】:

    猜你喜欢
    • 2021-05-25
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多