解决hibernate异常问题

时间:2011-11-23 21:52:52

标签: java hibernate

在运行时,应用程序(基于Java / Spring / Hibernate)会引发以下异常:

  

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

堆栈跟踪仅部分有助于找到问题的根源(这里是外键约束违规)。

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

2 个答案:

答案 0 :(得分:2)

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

有什么好处的,Log4Jdbc可以在同一行中记录绑定参数的actaul值。与内置的hibenrate日志记录相比,IMO的可读性大大提高,绑定参数显示为“?”并且绑定参数的实际值以不同的行显示。

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

以下是使用log4jdbc和log4j设置日志记录的简要说明。有关详细配置,请参阅official site

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

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

2.对于您正在使用的jdbc网址,请将jdbc替换为 jdbc:log4jdbc ,例如:

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

3.配置log4j.properties中不同记录器的日志记录级别。例如,仅在抛出异常时记录SQL:

log4j.logger.jdbc.sqlonly=ERROR

答案 1 :(得分:0)

您还可以通过将org.hibernate.SQL设置为debug并将org.hibernate.type设置为在日志配置中进行跟踪来启用Hibernate Logging