2

我有一个实体,它代表一个从到使用root element的大xml文件。我正在尝试使用 hibernate 来坚持它,但它正在抛出一个. 异常消息只是声明它不能将值转换为特定的对象类型。unmarshalledxmljavajaxbEntityManager.persist(elementname)HibernateExceptionBoolean

这是在该行引发错误的代码persist(cd)

public Long saveToDatabase(ClinicalDocument cd){
    Long id = null;
    try{
        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:
        id = cd.getHjid();
    }catch(HibernateException sqle){sqle.printStackTrace();}
    return id;
}

我上传了一个精简的工作 Eclipse 项目,可以让您在几分钟内重新创建这个问题。它是一个 zip 文件,您可以从此链接下载。要在您的机器上重现问题,只需:

1.) unzip the folder  
2.) import the folder into eclipse as an existing project
3.) change `persistence.properties` to include a valid username, password, and database name on your machine  
4.) then right click on `Main.java` and choose `Run As..Java Application`.   

然后它将重新创建错误。然后,您可以查看文件中的架构和schema.xsd文件中精简的 xml po.xml

您可以在以下屏幕截图中 查看目录结构并查看persistence.propertiespo.xmlschema.xsd和的位置:Main.java

我还得到以下堆栈跟踪:

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:265)
    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
4

1 回答 1

3

我相信你在这里有一个奇怪的命名冲突。id您有两个名为和的属性setId。每个属性,JAXB 生成两个 getter ( getXXX),如果指示“isSetter”检查属性是否已设置 - 对于原始类型很有用。这个“isSetter”被命名为isSetXXX.

在这种情况下,您的 isSetter forsetId与 getter for 冲突id

发行人setId

@Transient
public boolean isSetId() {
    return (this.id!= null);
}

吸气剂id

 public II getSetId() {
    return setId;
}

注意isSetIdgetSetId.. 这可能会让 Hibernate 发疯,因为它认为这isSetId是一个布尔吸气剂,而它期望一个实体吸气剂。

解决方案:使用绑定文件重命名setId模型中的属性。jaxb:property

于 2014-10-23T05:21:03.540 回答