显示失败发生时绑定到查询的参数

时间:2014-01-30 10:04:42

标签: java mysql eclipselink

将Eclipselink与MySQL配合使用。如果我的实体未正确验证且无效数据试图泄漏到数据库中,则会抛出运行时异常,其中包含以下详细信息:

Caused by: org.springframework.transaction.TransactionSystemException: Could not commit
JPA transaction; nested exception is javax.persistence.RollbackException: 
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.0.v20130815-a4708b6):
org.eclipse.persistence.exceptions.DatabaseException Internal Exception:
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'ip_address' at row 1
Error Code: 1406
Call: INSERT INTO statistics (action_name, created_at, ip_address, object_id, object_type, user_id) VALUES (?, ?, ?, ?, ?, ?)
     bind => [6 parameters bound]
Query: InsertObjectQuery(com.example.Statistics@3153ead4)"

我的问题是:如何从日志中发现并保存绑定参数的值? 6 parameters bound无济于事。


编辑:

简单而强大的解决方案是覆盖实体的toString()方法。然后它将在日志中使用,显示即将保存的对象的详细信息:

...
Call: INSERT INTO statistics (action_name, created_at, ip_address, object_id, object_type, user_id) VALUES (?, ?, ?, ?, ?, ?)
  bind => [6 parameters bound]
Query: InsertObjectQuery(Statistics{ID=null, ObjectType=PRODUCT, Action=VIEW, ObjectId=1, User=null, IP=someRandomInvalidTooLongIpAddress})"

但是,我仍然想知道是否有标志我可以设置为自动展开X parameters bound短语。

1 个答案:

答案 0 :(得分:4)

您可以使用eclipselink.logging.parameters持久性属性启用参数记录:

<property name="eclipselink.logging.parameters" value="true"/>

有关登录EclipseLInk的更多信息,请参阅http://wiki.eclipse.org/EclipseLink/Examples/JPA/Logging