javahibernateorm

Hibernate @One mapping: NullPointer leading to SingleTableEntityPersister exception


I have an @Any mapping on a Hibernate entity which uses discriminators. Back in an old code base it looked something like this (I've obscured the object names):

<any id-type="long" name="medicalProfessional" meta-type="string" >
    <meta-value value="M" class="com.xyz.app.domain.company.crew.MedicalProfessional"/>
    <meta-value value="D" class="com.xyz.app.domain.company.crew.Doctor"/>
    <column name="class_type"/>
    <column name="medical_professional_id"/>
</any>

Now, I have it mapped something like this (I've obscured the object names):

public class SomeClass extends DomainObject {
    @AnyMetaDef( name = "medicalProfessional", idType="int4", metaType="string", metaValues = {
    @MetaValue( value="M", targetEntity = MedicalProfessional.class ),
    @MetaValue( value="D", targetEntity = Doctor.class )
    })
    @Any( metaColumn = @Column( name="class_type" ), metaDef = "medicalProfessional")
    @JoinColumn( name="medical_professional_id" )
    private MedicalProfessional medicalProfessional;

As far as I can tell, everything else connected to this is configured properly. MedicalProfessional is a @MappedSuperclass and has its own table. Doctor is an Entity and extends MedicalProfessional and uses that same table. Other than that, the classes are trivial.

When I start up spring boot, I get an "org.hibernate.MappingException: Could not instantiate persister org.hibernate.persister.entity.SingleTableEntityPersister" exception.

The Mapping exception seems to go back to a null pointer exception:

Caused by: java.lang.NullPointerException
at org.hibernate.tuple.entity.EntityMetamodel.indicatesCollection(EntityMetamodel.java:868) ~[hibernate-support-0.5.1.jar:?]
    at org.hibernate.tuple.entity.EntityMetamodel.indicatesCollection(EntityMetamodel.java:874) ~[hibernate-support-0.5.1.jar:?]
    at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:289) ~[hibernate-support-0.5.1.jar:?]
    at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:517) ~[hibernate-support-0.5.1.jar:?]
    at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:124) ~[hibernate-support-0.5.1.jar:?]
    at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:?]
        at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[?:?]
        at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:?]
        at java.lang.reflect.Constructor.newInstance(Constructor.java:488) ~[?:?]
        at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:96) ~[hibernate-support-0.5.1.jar:?]
        at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:77) ~[hibernate-support-0.5.1.jar:?]
        at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:348) ~[hibernate-support-0.5.1.jar:?]
        at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444) ~[hibernate-support-0.5.1.jar:?]
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:879) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
        at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60) ~[spring-orm-4.3.19.RELEASE.jar:4.3.19.RELEASE]

Just in case it matters, hibernate-support-0.5.1.jar is one of my internal dependencies which provides hibernate 5.0.12.

I can't see any obvious causes of null pointers or missing constructors in my code base. I'm curious as to what might be happening here. Anything I'm doing wrong? I would greatly appreciate any assistance.


Solution

  • My problem was idType="int4" in @AnyMetaDef. It should have been idType="int"