java - 失败时显示查询绑定(bind)的参数

标签 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)"

我的问题是:如何从异常中发现绑定(bind)参数的值并将其保存在日志中? 6 个参数绑定(bind) 帮助不大。


编辑:

简单而强大的解决方案是覆盖实体的 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 短语。

最佳答案

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

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

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

关于java - 失败时显示查询绑定(bind)的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21453302/

相关文章:

java - 在正常模式下打开 Activity 并作为对话框

mysql - 如何优化查询

php - 如何使用纪元时间查看有多少用户在线?

mysql - EclipseLink、JPA、Mysql 关闭自动提交

java - 使用客户 ID 生成的 JPA 序列号

java - 断线 - Android

java - JMenuItem 和 JMenu 有什么区别

mysql - 日期之间的丢失比较

java - EntityManagerFactory 中实体管理器的正确使用

java - 如何同步 2 个作业/进程