0

我有 entity Foo,它映射到具有一些独特约束的 sql 表。因此保存Foo可能会失败。我FooDao用来保存Foo

@Repository
public class FooDao
{
  @Autowired
  private SessionFactory sessionFactory;

  @Transactional
  @Override
   public void add(Foo item) {
    sessionFactory.save(item);
   }
}

当我调用方法时FooDao#add(Foo),它可能因两个原因而失败:要么是因为违反唯一约束(在这种情况下,我知道如何处理问题),要么是因为其他一些问题(在这种情况下,我可能应该传播异常)。我如何区分这两种情况?

我可以添加方法find(Foo item)FooDao检查我试图添加的项目之类的东西是否是数据库。但这需要从数据库中进行额外的选择,我对此有点担心。

4

4 回答 4

1

这实际上是 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 找到的一个链接,

参考链接

但是寻找确切的参考和价值..

于 2012-10-09T14:03:19.747 回答
0

一个明显(但可能很糟糕)的解决方案是您捕获 javax.persistence.PersistenceException 并将错误消息解析为“暴力”或“约束”。

从我的角度来看,您应该预先进行选择/查找。请记住,您使用的是 ORM!Hibernate 涉及缓存,因此选择/查找和键约束错误都不是实际数据库查询的结果,而是根据您已经在缓存中加载的数据计算 Hibernate 的结果。

塞巴斯蒂安

于 2012-10-09T13:05:09.063 回答
0

捕获 org.hibernate.JDBCException。这有 getErrorCode()。对于唯一约束违反其 ORA-00001。

-麦迪

于 2012-10-09T13:20:35.320 回答
0

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

坏键可能是一个问题。但糟糕的价值观可能是另一回事。一些非空字段为空,或者某些内容不够长/短等。解决此问题可能涉及验证。您可以使用Hibernate Validator。你给你的字段一些漂亮的注释,然后你在进入数据库之前就在java中得到验证错误——错误发生得更快。

于 2012-10-09T17:43:41.363 回答