Java 在违反约束时自动失败

Java 在违反约束时自动失败,java,sql,spring,hibernate,Java,Sql,Spring,Hibernate,我有实体Foo,它映射到具有一些唯一约束的sql表。因此,保存Foo可能会失败。我正在使用FooDao来保存Foo: 当我调用方法foodoaddfoo时,它可能会失败,原因有两个:在本例中,由于唯一约束冲突,我知道如何处理该问题,或者由于本例中的某些其他问题,我可能应该传播该异常。我如何区分这两种情况 我可以将findfooitem方法添加到FooDao中,并检查我试图添加的类似item的东西是否是数据库。但这需要从数据库中进行额外的选择,对此我有点担心。一个明显但可能令人讨厌的解决方案是捕获

我有实体Foo,它映射到具有一些唯一约束的sql表。因此,保存Foo可能会失败。我正在使用FooDao来保存Foo:

当我调用方法foodoaddfoo时,它可能会失败,原因有两个:在本例中,由于唯一约束冲突,我知道如何处理该问题,或者由于本例中的某些其他问题,我可能应该传播该异常。我如何区分这两种情况


我可以将findfooitem方法添加到FooDao中,并检查我试图添加的类似item的东西是否是数据库。但这需要从数据库中进行额外的选择,对此我有点担心。

一个明显但可能令人讨厌的解决方案是捕获javax.persistence.PersistenceException并解析违规或约束的错误消息

在我看来,你应该提前进行选择/查找。请记住,您正在使用ORM!Hibernate包含缓存,因此,select/find或key contraint错误可能不是实际db查询的结果,而是基于缓存中已加载的数据计算Hibernate的结果


Sebastian

Catch org.hibernate.jdbception。这是getErrorCode。对于唯一约束,请参见其ORA-00001


-Maddy实际上是SQLState

做这样的事

Catch(HibernateException he){
   SQLException sqe = he.getSQLEception();
   String sqlState = sqe.getSQLState();
   if(sqlState.equals("23000"){
       // Handle your exception
   } 
}
Java文档: SQLState—标识异常的XOPEN或SQL:2003代码

我为ISO sqlStates找到了一个链接


但是,请查找准确的引用和值。

如果存在数据库异常,它会被捕获到,这是一个已检查的异常。Spring将其包装为未选中的。此异常将运行到控制器,并输出到Servlet,最后在浏览器和日志文件中的堆栈跟踪中结束。您可以捕获此异常并将其打印出来,以便查看发生了什么。这至少会让你知道什么是真正的破坏


坏键可能是一个问题。但糟糕的价值观可能是另一个原因。某些非空字段为空,或者某些字段不够长/短等。解决此问题可能需要验证。您可以使用。您给字段添加了一些漂亮的注释,然后在访问数据库之前就在java中出现了验证错误—错误发生得更快。

我不知道如何使用select/find upfront解决我的问题。我的应用程序的某些其他线程/节点仍然可能在select和insert之间插入冲突的实体。ORA-00001 Oracle不是特定的吗?在我的情况下,HibernateException将由Spring包装,但我猜SQLState就是我要找的。
Catch(HibernateException he){
   SQLException sqe = he.getSQLEception();
   String sqlState = sqe.getSQLState();
   if(sqlState.equals("23000"){
       // Handle your exception
   } 
}