Facing an error when upgrade to hibernate-core 6.6.33.Final or later vesion

I am using hibernate with postgresql

I have union subclass like below
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

Before upgrade it runs well with hibernate-core 6.6.22.Final

After upgrade to hibernate-core 6.6.33.Final or later my app throws below error

I am wondering if there are some changes I need to make ? it seems union subclass has issue.



Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2025-11-24 15:42:27 ERROR o.s.b.SpringApplication                                      857 [, main, , ] Application run failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Could not instantiate persister org.hibernate.persister.entity.UnionSubclassEntityPersister
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1826)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:607)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:529)
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:373)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:973)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627)
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752)
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:318)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1361)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1350)
        at net.jpmchase.wmdpi.WmDpiAlertServiceApplication.main(WmDpiAlertServiceApplication.java:46)
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
        at java.base/java.lang.reflect.Method.invoke(Method.java:580)
        at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:106)
        at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:64)
        at org.springframework.boot.loader.launch.JarLauncher.main(JarLauncher.java:40)
Caused by: jakarta.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Could not instantiate persister org.hibernate.persister.entity.UnionSubclassEntityPersister
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:431)
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:400)
        at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1873)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1822)
        ... 20 common frames omitted
Caused by: org.hibernate.MappingException: Could not instantiate persister org.hibernate.persister.entity.UnionSubclassEntityPersister
        at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:105)
        at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:77)
        at org.hibernate.metamodel.model.domain.internal.MappingMetamodelImpl.processBootEntities(MappingMetamodelImpl.java:250)
        at org.hibernate.metamodel.model.domain.internal.MappingMetamodelImpl.finishInitialization(MappingMetamodelImpl.java:184)
        at org.hibernate.internal.SessionFactoryImpl.initializeMappingModel(SessionFactoryImpl.java:373)
        at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:302)
        at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:463)
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1517)
        at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:66)
        at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390)
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:419)
        ... 24 common frames omitted
Caused by: java.lang.NullPointerException: Cannot invoke "org.hibernate.type.descriptor.sql.DdlType.getCastTypeName(org.hibernate.engine.jdbc.Size, org.hibernate.metamodel.mapping.SqlExpressible, org.hibernate.type.descriptor.sql.spi.DdlTypeRegistry)" because the return value of "org.hibernate.type.descriptor.sql.spi.DdlTypeRegistry.getDescriptor(int)" is null
        at org.hibernate.dialect.PostgreSQLDialect.getSelectClauseNullString(PostgreSQLDialect.java:952)
        at org.hibernate.persister.entity.UnionSubclassEntityPersister.getSelectClauseNullString(UnionSubclassEntityPersister.java:512)
        at org.hibernate.persister.entity.UnionSubclassEntityPersister.generateSubquery(UnionSubclassEntityPersister.java:496)
        at org.hibernate.persister.entity.UnionSubclassEntityPersister.<init>(UnionSubclassEntityPersister.java:181)
        at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:486)
        at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:94)
        ... 34 common frames omitted


Can you please debug to the point where the NPE happens and tell me what the SqlTypedMapping that causes this problem looks like?

Thanks beikov. It is jsonb
The below is from hibernate-core-6.6.33.FInal

sqlType column definition is “jsonb”
sqlType.jdbcMapping.name is io.hypersistence.utils.hibernate.type.json.JsonType.
Yes , I have

<dependency>
  <groupId>io.hypersistence</groupId>
  <artifactId>hypersistence-utils-hibernate-63</artifactId>
  <version>3.11.0</version>
</dependency>

sqlType.getJdbcMapping().getJdbcType().getDdlTypeCode() returns sqlTypeCode 1111

ddlRegistry does not have it and sqlTypeCode is not one of the defined types then null is returned

public DdlType getDescriptor(int sqlTypeCode) {
    final DdlType ddlType = ddlTypes.get( sqlTypeCode );
    if ( ddlType == null ) {
       switch ( sqlTypeCode ) {
          // these are no longer considered separate column types as such
          // they're just used to indicate that JavaType.getLongSqlLength()
          // should be used by default (and that's already handled by the
          // time we get to here)
          case SqlTypes.LONGVARCHAR:
             return ddlTypes.get( SqlTypes.VARCHAR );
          case SqlTypes.LONGNVARCHAR:
             return ddlTypes.get( SqlTypes.NVARCHAR );
          case SqlTypes.LONGVARBINARY:
             return ddlTypes.get( SqlTypes.VARBINARY );
       }
    }
    return ddlType;
}

My entity is something like below

@ Type(JsonType.class)
@ Column(name = "notification_message" , columnDefinition = "jsonb")
NotificationEventDetail notificationMessage ;

Now why would you use such a type that says its DDL type is java.sql.Types.OTHER? Hibernate ORM supports JSON out of the box, so start using that:

@JdbcTypeCode(SqlTypes.JSON)
@Column(name = "notification_message")
NotificationEventDetail notificationMessage;

Regardless, there is a bug, so I created HHH-19974.

Thanks , I forgot why I added columnDefinition = “jsonb” :frowning:

Use the change posted, still see the same issue

Please try to create a reproducer with our test case template and if you are able to reproduce the issue, create a bug ticket in our issue tracker and attach that reproducer.

Let me give it a try

It is not a hibernate issue but caused by hypersistence-utils-hibernate-63
When I was trying to build the test case I found the issue was gone.

Then build another project from scratch to confirm by removing hypersistence-utils-hibernate-63 from class path