在 Hibernate 5.2.11 的 HBMXML 中使用 <cache usage=“read-only”/> 时获取 NPE
Getting NPE while using <cache usage=“read-only”/> in HBMXML in Hibernate 5.2.11
我已经将 Hibernate 版本从 Hibernate ORM 4.3 升级到 5.2.11 版本,我们正在使用使用 .hbmxml 文件的 hibernate 框架。我们遇到了一个现在抛出 NPE 的用例,它是一个在实体定义中使用缓存使用属性的简单用例。
我们的 hbmxml 文件的简化版本如下所示
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class entity-name="CountryCrash" lazy="true"
name="xyz.test.CountryCrash" table="COUNTRY">
<cache usage="read-only"/>
<id name="id" type="long" unsaved-value="0">
<column name="ID"/>
<generator class="sequence">
<param name="sequence">GENERAL_SEQUENCE</param>
</generator>
</id>
<property name="name" type="string">
<column name="NAME"/>
</property>
</class>
</hibernate-mapping>
虽然这在旧版本的 Hibernate 上工作得很好,但随着升级到 Hibernate 版本 5.2.11,它开始抛出以下异常
java.lang.NullPointerException
at com.sun.xml.bind.v2.runtime.unmarshaller.StAXConnector.getPublicId(StAXConnector.java:101)
at org.apache.xerces.util.SAXLocatorWrapper.getPublicId(Unknown Source)
at org.apache.xerces.xni.parser.XMLParseException.<init>(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator$XSIErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.reportSchemaError(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown Source)
at org.apache.xerces.jaxp.validation.ValidatorHandlerImpl.startElement(Unknown Source)
at com.sun.xml.bind.v2.runtime.unmarshaller.ValidatingUnmarshaller.startElement(ValidatingUnmarshaller.java:101)
at com.sun.xml.bind.v2.runtime.unmarshaller.InterningXmlVisitor.startElement(InterningXmlVisitor.java:75)
at com.sun.xml.bind.v2.runtime.unmarshaller.StAXEventConnector.handleStartElement(StAXEventConnector.java:261)
at com.sun.xml.bind.v2.runtime.unmarshaller.StAXEventConnector.bridge(StAXEventConnector.java:130)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:460)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:435)
at org.hibernate.boot.jaxb.internal.AbstractBinder.jaxb(AbstractBinder.java:171)
at org.hibernate.boot.jaxb.internal.MappingBinder.doBind(MappingBinder.java:61)
at org.hibernate.boot.jaxb.internal.AbstractBinder.doBind(AbstractBinder.java:102)
at org.hibernate.boot.jaxb.internal.AbstractBinder.bind(AbstractBinder.java:84)
at org.hibernate.boot.jaxb.internal.JaxpSourceXmlSource.doBind(JaxpSourceXmlSource.java:29)
at org.hibernate.boot.MetadataSources.addDocument(MetadataSources.java:409)
at org.hibernate.cfg.Configuration.addDocument(Configuration.java:462)
我尝试使用 Hibernate ORM 源代码进行调试,但没有得到太多关于为什么我们为这种情况获得 NPE 的帮助。
如果我遗漏了什么或者我们在升级时遗漏了什么,请告诉我。仅当我们添加
时才会发生此问题
<cache usage="read-only"/>
hbmxml 中的属性,如果我们删除它,它可以正常工作。
提前感谢您的帮助。
谢谢,
所以我得到了问题,生成的 xml 的问题是缓存节点应该在 tuplizer 节点之后,因为正在使用的模式是 http://hibernate.org/xsd/orm/hbm/legacy-mapping-4.0.xsd , which needs the cache node to come after Tuplizer, I got this resolved from the hibernate forums. The discussions details are @ https://discourse.hibernate.org/t/getting-npe-while-using-cache-usage-read-only-in-hbmxml-in-hibernate-5-2-11/4730
我已经将 Hibernate 版本从 Hibernate ORM 4.3 升级到 5.2.11 版本,我们正在使用使用 .hbmxml 文件的 hibernate 框架。我们遇到了一个现在抛出 NPE 的用例,它是一个在实体定义中使用缓存使用属性的简单用例。
我们的 hbmxml 文件的简化版本如下所示
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class entity-name="CountryCrash" lazy="true"
name="xyz.test.CountryCrash" table="COUNTRY">
<cache usage="read-only"/>
<id name="id" type="long" unsaved-value="0">
<column name="ID"/>
<generator class="sequence">
<param name="sequence">GENERAL_SEQUENCE</param>
</generator>
</id>
<property name="name" type="string">
<column name="NAME"/>
</property>
</class>
</hibernate-mapping>
虽然这在旧版本的 Hibernate 上工作得很好,但随着升级到 Hibernate 版本 5.2.11,它开始抛出以下异常
java.lang.NullPointerException
at com.sun.xml.bind.v2.runtime.unmarshaller.StAXConnector.getPublicId(StAXConnector.java:101)
at org.apache.xerces.util.SAXLocatorWrapper.getPublicId(Unknown Source)
at org.apache.xerces.xni.parser.XMLParseException.<init>(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator$XSIErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.reportSchemaError(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown Source)
at org.apache.xerces.jaxp.validation.ValidatorHandlerImpl.startElement(Unknown Source)
at com.sun.xml.bind.v2.runtime.unmarshaller.ValidatingUnmarshaller.startElement(ValidatingUnmarshaller.java:101)
at com.sun.xml.bind.v2.runtime.unmarshaller.InterningXmlVisitor.startElement(InterningXmlVisitor.java:75)
at com.sun.xml.bind.v2.runtime.unmarshaller.StAXEventConnector.handleStartElement(StAXEventConnector.java:261)
at com.sun.xml.bind.v2.runtime.unmarshaller.StAXEventConnector.bridge(StAXEventConnector.java:130)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:460)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:435)
at org.hibernate.boot.jaxb.internal.AbstractBinder.jaxb(AbstractBinder.java:171)
at org.hibernate.boot.jaxb.internal.MappingBinder.doBind(MappingBinder.java:61)
at org.hibernate.boot.jaxb.internal.AbstractBinder.doBind(AbstractBinder.java:102)
at org.hibernate.boot.jaxb.internal.AbstractBinder.bind(AbstractBinder.java:84)
at org.hibernate.boot.jaxb.internal.JaxpSourceXmlSource.doBind(JaxpSourceXmlSource.java:29)
at org.hibernate.boot.MetadataSources.addDocument(MetadataSources.java:409)
at org.hibernate.cfg.Configuration.addDocument(Configuration.java:462)
我尝试使用 Hibernate ORM 源代码进行调试,但没有得到太多关于为什么我们为这种情况获得 NPE 的帮助。
如果我遗漏了什么或者我们在升级时遗漏了什么,请告诉我。仅当我们添加
时才会发生此问题<cache usage="read-only"/>
hbmxml 中的属性,如果我们删除它,它可以正常工作。
提前感谢您的帮助。
谢谢,
所以我得到了问题,生成的 xml 的问题是缓存节点应该在 tuplizer 节点之后,因为正在使用的模式是 http://hibernate.org/xsd/orm/hbm/legacy-mapping-4.0.xsd , which needs the cache node to come after Tuplizer, I got this resolved from the hibernate forums. The discussions details are @ https://discourse.hibernate.org/t/getting-npe-while-using-cache-usage-read-only-in-hbmxml-in-hibernate-5-2-11/4730