gpt4 book ai didi

java - 使用 JPA 防止违反唯一约束的最佳方法

转载 作者:搜寻专家 更新时间:2023-10-31 19:58:22 24 4
gpt4 key购买 nike

我有一个 Keyword 和一个 KeywordType 作为实体。有很多类型很少的关键字。

当尝试持久化类型的第二个关键字时,违反了唯一约束并且事务被回滚。

搜索 SO 我发现了几种可能性(其中一些来自不同的上下文,所以我不确定它们在这里的有效性)- this postthis post建议捕获对我没有用的异常,因为我最终会从开始的地方开始并且仍然需要以某种方式保留关键字。
同样适用于针对不同情况提出的锁定here
自定义插入语句,如this中所建议的那样和 this我猜帖子不会正常工作,因为我使用的是 Oracle 而不是 MySQL,并且希望将实现与 Hibernate 联系起来。

另一种解决方法是首先尝试在生成关键字的代码中检索类型,如果找到则将其设置在关键字上,否则创建一个新的。

那么,什么是最好的——最健壮、可移植(对于不同的数据库和持久性提供者)和最明智的方法?

谢谢。

相关实体:

public class Keyword {

@Id
@GeneratedValue
private long id;

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

@ManyToOne
@JoinColumn(name = "TYPE_ID")
private KeywordType type;
...
}

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

@Id
@GeneratedValue
private long id;

@Column(name = "TYPE")
private String type;
...
}

最佳答案

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

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

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

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

关于java - 使用 JPA 防止违反唯一约束的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5117783/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com