【发布时间】:2014-10-22 17:39:59
【问题描述】:
我需要保存一个包含多层嵌套子节点的大型复杂实体。数据来自一个 xml 文件,该文件从 xml 解组到 java。由于我需要一次解决一个小故障,坚持失败了。此外,在尝试持久化数据之前,我需要验证数据。
目前,我只是在尝试持久化它,但持久化命令只是一行代码。我如何调试它以找出一行代码失败的地方?我可以在调试模式下运行 eclipse,但如果我只有一行代码在调试器中停止,我将不得不对实体的内容进行大量挖掘。 有没有更好的调试方法,这样我就可以查明引发错误的准确位置,而不是挖掘密集嵌套的实体结构?这是我的代码:
public Long saveToDatabase(SomeDocument cd){
final EntityManager saveManager = entityManagerFactory.createEntityManager();
saveManager.getTransaction().begin();
saveManager.persist(cd);
saveManager.getTransaction().commit();
saveManager.close();
//After the object is saved, we can get the generated id:
final Long id = cd.getHjid();
return id;
}
作为参考,我在下面附上了当前的堆栈跟踪。它表明数据中有一个Boolean 实体,不能转换为特定的应用程序定义的数据类型。问题是cd 实体中至少有 75 个位置具有错误消息中提到的特定数据类型。 所以这里的堆栈跟踪并不那么重要。我想要的是嵌套实体结构的深层内容的更细粒度的视图,而不必手动摆动 eclipse 调试视图的变量选项卡.
Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.HibernateException: Unable to resolve entity name from Class [java.lang.Boolean] expected instance/subclass of [org.jvnet.hyperjaxb3.ejb.tests.pocustomized.II]
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1215)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1148)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1154)
at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:678)
at productionmain.DataFunctions.saveToDatabase(DataFunctions.java:261)
at productionmain.Main.main(Main.java:21)
Caused by: org.hibernate.HibernateException: Unable to resolve entity name from Class [java.lang.Boolean] expected instance/subclass of [org.jvnet.hyperjaxb3.ejb.tests.pocustomized.II]
at org.hibernate.tuple.entity.PojoEntityTuplizer.determineConcreteSubclassEntityName(PojoEntityTuplizer.java:360)
at org.hibernate.persister.entity.AbstractEntityPersister.getSubclassEntityPersister(AbstractEntityPersister.java:3941)
at org.hibernate.impl.SessionImpl.getEntityPersister(SessionImpl.java:1494)
at org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:202)
at org.hibernate.event.def.AbstractSaveEventListener.getEntityState(AbstractSaveEventListener.java:531)
at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:102)
at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:799)
at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:791)
at org.hibernate.engine.EJB3CascadingAction$1.cascade(EJB3CascadingAction.java:48)
at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:392)
at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:335)
at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204)
at org.hibernate.engine.Cascade.cascade(Cascade.java:161)
at org.hibernate.event.def.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventListener.java:450)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:282)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129)
at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:69)
at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:179)
at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:135)
at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:61)
at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:808)
at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:782)
at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:786)
at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:672)
... 2 more
【问题讨论】:
-
理论上,Hibernate 异常应该包含所有你需要找出确切原因的信息。在实践中,通过在 Eclipse 中打开“异常中断”,我很幸运,然后我只是从那里摆动。
-
查看日志?看看异常(我们看不到)?
-
那么跟踪所指的这个“HyperJAXB3”对象和布尔值是什么?似乎正在尝试使用 Hibernate 来持久化它们
-
对解决方案感兴趣的人:stackoverflow.com/questions/26517573/…