3

有没有办法找出在 Hibernate 中导致这种违规的记录?

通常,您将对象添加到会话中,最后将它们持久化。如果发生此类错误,则需要一段时间才能找到违反约束的记录。

有没有办法找出导致的记录(对于新对象的“toString()”或现有对象的主键应该极大地简化调试过程。

谢谢。


org.hibernate.exception.ConstraintViolationException: could not insert: [com.project.valueobject.mapping.Model]
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:40)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2163)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2643)
    at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:51)
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
    at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:298)
    at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181)
    at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:107)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:94)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
    at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:507)
    at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:499)
    at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:495)
4

3 回答 3

1

我会实现一个或多个Hibernate 事件监听器,并在执行操作之前做一些日志记录。希望这适合您的场景。

(我怀疑你没有像我一样使用 MySQL,因为如果违反约束,MySQL 实际上会返回有问题的唯一键)

于 2009-10-20T13:08:32.840 回答
0

我只是设置了一个断点AbstractEntityPersister::performInsert(...)来找出违规记录。

正如_NT所说,MySQL可能支持这一点,但Oracle不支持。

但是会保持开放以了解任何优雅的解决方案。

于 2009-10-21T11:55:44.363 回答
0

使用 TRACE 级别的日志级别显示传递到数据库的所有参数的值。

于 2010-05-04T17:32:46.420 回答