liquibase-hibernate icon indicating copy to clipboard operation
liquibase-hibernate copied to clipboard

NullPointerException for jsonb Postgres column

Open heck-gd opened this issue 10 months ago • 0 comments

We're currently migrating a project to hibernate6 and ran into an issue. Our database server is PostgreSQL and we're using the io.hypersistence:hypersistence-utils-hibernate-63 package to get json/jsonb column support in Hibernate.

A simplified example looks like this:

import io.hypersistence.utils.hibernate.type.json.JsonBinaryType;
import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.Type;

import jakarta.persistence.*;
import jakarta.validation.constraints.NotNull;

public class TheData {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    @Type(JsonBinaryType.class)
    @Column(columnDefinition = "jsonb")
    @ColumnDefault("{}")
    private String info = "{}";
}

When running diffChangelog, this results in:

Caused by: java.lang.NullPointerException: Cannot invoke "liquibase.datatype.LiquibaseDataType.getName()" because "liquibaseDataType" is null
	at liquibase.util.SqlUtil.parseValue(SqlUtil.java:244)
	at liquibase.ext.hibernate.snapshot.ColumnSnapshotGenerator.snapshotColumn(ColumnSnapshotGenerator.java:130)
	at liquibase.ext.hibernate.snapshot.ColumnSnapshotGenerator.addTo(ColumnSnapshotGenerator.java:78)
	at liquibase.ext.hibernate.snapshot.HibernateSnapshotGenerator.snapshot(HibernateSnapshotGenerator.java:82)
	at liquibase.snapshot.SnapshotGeneratorChain.snapshot(SnapshotGeneratorChain.java:49)
	at liquibase.snapshot.DatabaseSnapshot.include(DatabaseSnapshot.java:313)
	at liquibase.snapshot.DatabaseSnapshot.replaceObject(DatabaseSnapshot.java:456)
	at liquibase.snapshot.DatabaseSnapshot.replaceObject(DatabaseSnapshot.java:478)
	at liquibase.snapshot.DatabaseSnapshot.includeNestedObjects(DatabaseSnapshot.java:369)
	at liquibase.snapshot.DatabaseSnapshot.include(DatabaseSnapshot.java:332)
	at liquibase.snapshot.DatabaseSnapshot.init(DatabaseSnapshot.java:106)
	at liquibase.snapshot.DatabaseSnapshot.<init>(DatabaseSnapshot.java:59)
	at liquibase.snapshot.JdbcDatabaseSnapshot.<init>(JdbcDatabaseSnapshot.java:38)
	at liquibase.snapshot.SnapshotGeneratorFactory.createSnapshot(SnapshotGeneratorFactory.java:214)
	at liquibase.snapshot.SnapshotGeneratorFactory.createSnapshot(SnapshotGeneratorFactory.java:187)
	at liquibase.command.core.DiffCommandStep.generateDatabaseShapshot(DiffCommandStep.java:205)
	at liquibase.command.core.DiffCommandStep.createReferenceSnapshot(DiffCommandStep.java:192)
	at liquibase.command.core.DiffCommandStep.createDiffResult(DiffCommandStep.java:113)
	at liquibase.command.core.DiffCommandStep.run(DiffCommandStep.java:89)
	at liquibase.command.CommandScope.execute(CommandScope.java:219)
	... 18 more

It logs [liquibase.ext] Found column info jsonb, but the parseType is an object where all fields are null, causing the exception.

hibernateColumn contains a value of type BasicValue which in turn has a resolution that contains the JsonBinaryType stuff, but Liquibase doesn't seem to pick up on it. The typeName field is not going to be set for such values.

heck-gd avatar Apr 19 '24 14:04 heck-gd