【问题标题】:JPA annotation and ConstraintViolationExceptionJPA 注释和 ConstraintViolationException
【发布时间】: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


【解决方案1】:

如果您想显示注释中定义的“必填字段”消息,您可以像这样捕获您的异常:

catch(javax.validation.ConstraintViolationException cve){
  Set<ConstraintViolation<?>> cvs = cve.getConstraintViolations();
  String errMsg = "";
  for (ConstraintViolation<?> cv : cvs) {    
    errMsg = cv.getMessage();
  }
}

参考请查看OpenJPA Bean Validation Primer

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 2011-12-07
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多