使用JPA防止唯一约束违规的最佳方法

kos*_*tja 5 java jpa constraints unique

我有一个Keyword和一个KeywordType实体.有很多类型的关键字.

尝试保留类型的第二个关键字时,违反了唯一约束并回滚了事务.

搜索我发现了几个可能性(其中一些来自不同的背景,所以我不确定它们的有效性在这里) - 这篇文章这篇文章建议捕获对我没有用的例外,因为我最终在我开始的地方并且仍然需要以某种方式持久保存关键字.
同样适用于锁定提出了不同的situaltion 这里
自定义插入在提出陈述这个这个职位是行不通的正确我想,因为我使用的是Oracle而不是MySQL和woulnd喜欢扎到Hibernate实现.

一种不同的解决方法是尝试在生成关键字的代码中首先检索类型,并在找到关键字时将其设置为关键字,否则创建一个新关键字.

那么,什么是最好的 - 最强大,可移植(适用于不同的数据库和持久性提供商)和理智的方法?

谢谢.

涉及的实体:

public class Keyword {

    @Id
    @GeneratedValue
    private long id;

    @Column(name = "VALUE")
    private String value;

    @ManyToOne
    @JoinColumn(name = "TYPE_ID")
    private KeywordType type;
    ...
}
Run Code Online (Sandbox Code Playgroud)

@Entity
@Table(uniqueConstraints = {@UniqueConstraint(columnNames = { "TYPE" }) })
public class KeywordType {

    @Id
    @GeneratedValue
    private long id;

    @Column(name = "TYPE")
    private String type;
    ...
}
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 6

你的最后一个解决方案是正确的,IMO。搜索关键字类型,如果未找到,则创建它。

捕获异常不是一个好的选择,因为

  • 很难知道要捕获哪个异常并使您的代码在 JPA 和 DB 引擎之间可移植
  • JPA 引擎在发生此类异常后将处于不确定状态,在这种情况下您应该始终回滚。

但是请注意,使用此技术,您可能仍然有两个事务并行搜索相同类型,然后尝试并行插入它。其中一项事务将回滚,但频率会低得多。