将 Spring Data JPA 与 Oracle Identity 列和不同的列用作主键时如何处理约束冲突?

问题描述 投票:0回答:0

带有 Oracle DB 的 Spring JPA:我们的数据库模式有一个包含 Oracle Identity 列 (id) 和另一列作为主键 uuid 的表。我遇到的问题是在 JPARepository 上使用

save
操作时。

    id                  NUMBER GENERATED BY DEFAULT AS IDENTITY,
    UUID                VARCHAR2(50 BYTE)                                      NOT NULL ENABLE,
    DOC_TYPE            VARCHAR2(50 BYTE)                                      NOT NULL ENABLE,
    DESCRIPTION         VARCHAR2(50 BYTE)                                      NOT NULL ENABLE,
    PRIMARY KEY (UUID)

我的实体类看起来像这样

public class Document {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "UUID", unique = true, nullable = false, updatable = false)
    private String uuid;

    @Column(name = "DOC_TYPE", nullable = false)
    private String docType;

    @Column(name = "DESCRIPTION", nullable = false)
    private String description;
}

当我使用瞬态实体在 Spring Data JPA 存储库上调用

save
操作时,当正在保存的瞬态对象具有与数据库中行的 uuid 匹配的 uuid 时,我会遇到约束冲突。理想情况下,我希望将瞬态实体与持久实体合并。

数据库实体与传入实体

id: 1
uuid: sadwe-1232-123
docType: Invoice
description: Vendor inc.
id: 
uuid: sadwe-1232-123
docType: Receipt
description: Vendor inc.

我明白为什么我们会看到约束冲突——因为 uuid 没有设置为 Document 类的 @Id 属性,spring 没有意识到这两个实体是相同的,并试图插入一个新实体。除了我将属性从瞬态实体映射到持久实体然后保存持久实体之外,是否有解决此问题的优雅方法?

oracle hibernate jpa spring-data-jpa spring-data
© www.soinside.com 2019 - 2024. All rights reserved.