【发布时间】:2013-03-28 17:17:19
【问题描述】:
我正在使用 Postgresql、Hibernate 和 JPA。每当数据库中出现异常时,我都会得到类似这样的信息,这不是很有帮助,因为它没有显示数据库服务器上真正出了什么问题。
Caused by: java.sql.BatchUpdateException: Batch entry 0 update foo set ALERT_FLAG='3' was aborted. Call getNextException to see the cause.
at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2621)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1837)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:407)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2754)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:1723)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
... 82 more
我希望数据库中的异常消息出现在应用程序的日志中。
我遇到了this article,它使用 Aspect 填充异常链,否则在 SQLExceptions 的情况下无法正确填充。
有没有办法在不使用 Aspects 或任何自定义代码的情况下解决此问题。理想的解决方案只涉及配置文件更改。
【问题讨论】:
-
你是如何输出异常的?我使用 log4j 和 slf4j 的经验,我免费得到了由线路引起的......
-
日志库确实会打印原因,但如果 excption 遵循异常链接约定,它们会这样做。即每个异常都应该通过 getCause() 方法返回其直接根本原因。显然,SQLException 不遵循这个约定。我链接的文章解释了相同的内容。因此作者编写了一个切面,它将 getNextException() 返回的对象设置为父异常中的原因。
-
@Priyank
SQLException在发生多个(不相关的?)异常时使用异常链(可以使用迭代器或使用getNextException()进行迭代)。这个概念与原因链正交。在这个具体的例子中,我确实认为它应该被设置为原因。 -
我正在寻找比编写自定义代码更好的解决方案。我认为这个问题(无法看到 DB 消息)太常见了,没有更优雅的解决方案。
-
ryanp 是对的,但他的回答很冗长:简而言之,由于批量插入,您的日志中应该有一个来自
SqlExceptionHelper的错误行(在您的堆栈跟踪上方),原因是:null value in column "id" violates not-null constraint
标签: java hibernate postgresql jpa jdbc