[
http://opensource.atlassian.com/projects/hibernate/browse/HHH-3854?page=c...
]
Erik-Berndt Scheper commented on HHH-3854:
------------------------------------------
I see the same NPE with JPA / annotations, but only if the persistent object is a final
class.
The reason behind this is that the proxyFactory is null (as above), because the
constructor of EntityMetaModel.class (in hibernate core) then declares it as non-lazy
(line 267-271 in EntityMetaModel.java, hibernate-core-3.3.2.GA):
lazy = persistentClass.isLazy() && (
// TODO: this disables laziness even in non-pojo entity modes:
!persistentClass.hasPojoRepresentation() ||
!ReflectHelper.isFinalClass( persistentClass.getProxyInterface() )
);
Becayse the entityMetamodel is NOT lazy for final classes the constructor of the
AbstractEntityTuplizer (i.e. any tuplizer) will set the proxyFactory to null (line 150-158
in AbstractEntityTuplizer .java, hibernate-core-3.3.2.GA):
if ( entityMetamodel.isLazy() ) {
proxyFactory = buildProxyFactory( mappingInfo, idGetter, idSetter );
if (proxyFactory == null) {
entityMetamodel.setLazy( false );
}
}
else {
proxyFactory = null;
}
This all eventually leads to a NPE in hibernate envers ToOneIdMapper.class
java.lang.NullPointerException
at
org.hibernate.tuple.entity.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:394)
at
org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:3469)
at
org.hibernate.envers.entities.mapper.relation.ToOneIdMapper.mapToEntityFromMap(ToOneIdMapper.java:84)
at
org.hibernate.envers.entities.mapper.MultiPropertyMapper.mapToEntityFromMap(MultiPropertyMapper.java:117)
at
org.hibernate.envers.entities.EntityInstantiator.createInstanceFromVersionsEntity(EntityInstantiator.java:93)
at
org.hibernate.envers.entities.EntityInstantiator.addInstancesFromVersionsEntities(EntityInstantiator.java:103)
at
org.hibernate.envers.query.impl.EntitiesAtRevisionQuery.list(EntitiesAtRevisionQuery.java:90)
at
org.hibernate.envers.query.impl.AbstractAuditQuery.getSingleResult(AbstractAuditQuery.java:104)
at org.hibernate.envers.reader.AuditReaderImpl.find(AuditReaderImpl.java:104)
<rest of trace skipped>
Issue with greedy loading of associations (default-lazy=false )
---------------------------------------------------------------
Key: HHH-3854
URL:
http://opensource.atlassian.com/projects/hibernate/browse/HHH-3854
Project: Hibernate Core
Issue Type: Bug
Components: envers
Environment: Hibernate - core 3.4.0-SNAPSHOT, Hibernate-envers (from trunk)
Reporter: Amar Singh
Attachments: greedy-loading.zip
I have an Entity GP which has a many to one association to entity CA.
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD
3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping
package="org.hibernate.envers.test.integration.onetoone.bidirectional"
default-lazy="false">
<class name="BidirectionalRefIngPK"
table="BIDIRECTIONAL_REFERENCING_ENTITY">
<id name="id" type="long"
column="BIDIRECTIONAL_REFERENCING_ID" >
<generator class="native"/>
</id>
<property name="data"/>
<many-to-one name="reference" cascade="save-update"
class="BidirectionalRefEdPK"
column="BIDIRECTIONAL_REFERENCED_ID"/>
</class>
<class name="BidirectionalRefEdPK"
table="BIDIRECTIONAL_REFERENCED_ENTITY">
<id name="longId" type="long"
column="BIDIRECTIONAL_REFERENCED_ID">
<generator class="native"/>
</id>
<property name="data"/>
</class>
</hibernate-mapping>
With this when I load a previous version of BidirectionalRefIngPK, the loading mechanism
tries to create a proxy for BidirectionalRefEdPK, but in my case lazy is false so an
internal call to createProxy will return NULL hence .
This happens in ToOneIdMapper.java in method mapToEntityFromMap around line 82, which
then internally calls for AbstractEntityTuplizer.java line 395 for getProxyFactory()
ending in NULL pointer exception because proxy factory is null as mine is a greedy
loading.
TO REPRODUCE
~~~~~~~~~~~~~
Please find a zipped folder attached. The zipped file has 4 files:
- GreedyLoading.java (actual testng test case)
- BidirectionalRefEdPK.java (Entity 1)
- BidirectionalRefIngPK.java (Entity 2)
- greedyloading.hbm.xml
Please place the three java files in its package
(org.hibernate.envers.test.integration.onetoone.bidirectional), couldn't find the
right package so created test case accordingly. Put the greedyloading.hbm.xml in
src/test/resources.
Now when testng runs GreedyLoading.java you should see NPE.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://opensource.atlassian.com/projects/hibernate/secure/Administrators....
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira