【发布时间】:2013-05-05 15:20:43
【问题描述】:
这个问题被反复询问/提及,但我找不到我做错了什么或者问题是“真实的”: 我有一个简单的 Oracle 表的实体类,其中有一个字段应该是唯一的。 它在数据库中有一个独特的约束。 在实体定义中,我添加了 JPA 注释 -
@Entity
@Table(name = "tbl", uniqueConstraints = @UniqueConstraint(columnNames = "uni_field"))
public class MyTable implements Serializable {
...
@Column(name = "uni_field", unique = true)
@NotNull(message = "Field is required.")
private String field;
...
我正在使用 JBoss
问题是我总是以休眠异常结束,如果我想知道约束违反,它将我与 JPA 实现联系起来。
有没有办法在这种情况下捕捉持久性异常并提供用户友好的消息?
如果不是 @Column(name = "uni_field", unique = true) 或 uniqueConstraints = @UniqueConstraint(columnNames = "uni_field") 有什么用处?
【问题讨论】:
-
定义您执行的哪些 JPA 操作会产生此异常。 DataNucleus JPA 不会抛出特定于实现的异常,因为它符合 API(任何特定于实现的异常都应该只嵌套)
-
我正在尝试使用实体管理器添加实体。刷新时,假设提供的“字段”不是唯一的,结果是一个持久异常,(确实)一个嵌套的休眠约束违反异常。但是如何在不创建对休眠 jar 的依赖的情况下提取确切的约束违规?
-
你不能,因为 JPA 没有定义这样的语义,除非有一个低级 SQL 异常你可以在某处执行它(但这会让你依赖于数据库)
标签: java jpa constraints unique-constraint