2011-11-23 72 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記錄在你的日誌配置跟蹤