2011-11-23 70 views
1

在运行时应用程序(基于Java /春/休眠)引发以下例外:疑难解答休眠例外

07:18:38.511错误错误批量元素#1:的插入或更新值主键“SOME_FIELD.SQL_11410213222”不等于父表的父键的任何值.. SQLCODE = -530

堆栈跟踪找到问题(的根在这里外国只是部分帮助关键约束违规)。

有没有办法打印导致此异常(或至少在声明中使用的参数)的SQL?我知道这可以通过调整日志记录配置来实现,但是那些运行正常的语句和导致错误的语句都将被记录下来。我只想输出与错误陈述有关的信息......这是可行的吗?

+1

是的,你可以 http://stackoverflow.com/questions/2536829/hibernate-show-real-sql – osdamv

+0

@osdamv:那会告诉我所有的sql语句,而我只对sql语句感兴趣抛出一个Hibernate异常。 – Eleco

+0

你可以把一个断点... – osdamv

回答

2

Log4Jdbc是可以拦截JDBC调用并记录信息的JDBC代理驱动程序,例如DB中执行的确切SQL和SQL时序信息。

好的是Log4Jdbc可以在同一行记录绑定参数的实际值。它大大提高了可读性IMO与内置的hibenrate日志记录绑定参数显示为“?”并且绑定参数的实际值以不同的行显示。

通过将日志记录器jdbc.sqlonly的日志记录级别设置为ERROR,可以限制仅在抛出异常时记录SQL。

以下是使用log4jdbc和log4j设置日志记录的简要要点。具体配置,可以参考official site

1.更改使用Log4Jdbc的JDBC驱动程序:

<property name="connection.driver_class">net.sf.log4jdbc.DriverSpy</property> 

2.对于您所使用的JDBC URL,与JDBC替换为jdbc: log4jdbc,例如:

<property name="connection.url">jdbc:log4jdbc:postgresql://localhost:5432/Test?protocolVersion=2</property> 

3.Configure用于log4j.properties不同记录器的记录级别。例如,只记录时,抛出异常的SQL:

log4j.logger.jdbc.sqlonly=ERROR 
0

您还可以通过设置org.hibernate.SQL调试和org.hibernate.type启用Hibernate记录在你的日志配置跟踪