【问题标题】:debugging entitymanager while persisting complicated entity在持久化复杂实体的同时调试实体管理器
【发布时间】: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/…

标签: java hibernate jpa


【解决方案1】:

有几件事需要调查。

  1. 对于实体中的布尔类型,数据库表中对应的数据类型是什么?
  2. 添加 try catch 块并查看异常对象。通过在调试模式下检查实际原因直到 SQLException 来导航您的异常对象。
    1. 我无法打开堆栈跟踪链接。能否请您在此处粘贴。

【讨论】:

  • 您需要继续检查原因或异常的下一个字段,直到您收到一些有意义的消息。
猜你喜欢
  • 2014-05-13
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多