Sandeep
Sandeep

Reputation: 119

How to use Hibernate 5.2.10 MySQL JSON support without AttributeConverter or customUserType to map to Java Entity Class?

I am trying to map the MySQL JSON column to Java Entity class. Looking for the cleanest way of doing this.

Upon doing some research found 3 possible ways:

  1. Extending AbstractSingleColumnStandardBasicType
  2. Create a custom UserType
  3. Use an attribute Converter

I used an attribute converter to convert the JSON column from String (as MySQL driver makes it to a String) to my required type - this works with both the Hibernate V4.3.10 and V5.2.10

I tried to find if JSON is natively supported in Hibernate and found the PR https://github.com/hibernate/hibernate-orm/pull/1395, based on the PR looks like it does add JSON mapping to the MySQL Dialect hence letting Hibernate know about the JSON Column.

Does this mean I can use something like this to map to JSON Column in DB ?@Column(name="json_type_column") Private Object correspondingJsonAttribute;

If I cannot use it like this and need to use one of the above 3 methods, is there a reason I would need to upgrade to get the registerColumnType( Types.JAVA_OBJECT, "json" ); which is part of the PR and is present in Hibernate V5.2.10, Do I get any more features from V5.2.10 that support JSON columns?

I also looked into the corresponding test case to understand how the JSON column mapping is being done https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/test/java/org/hibernate/test/bytecode/enhancement/access/MixedAccessTestTask.java, this uses @Access annotation via property, looks like it sets the corresponding JSON column variable in Entity to Map after converting it from String.

Any help is much appreciated.

Thanks!

Upvotes: 2

Views: 4577

Answers (1)

Vlad Mihalcea
Vlad Mihalcea

Reputation: 153930

Upon doing some research found 3 possible ways:

  • Extending AbstractSingleColumnStandardBasicType
  • Create a custom UserType
  • Use an attribute Converter

AttributeConvertor won't help you for this, but you can still use a custom UserType, or Hibernate Type Descriptors.

Does this mean I can use something like this to map to JSON Column in DB?

@Column(name="json_type_column")  Private Object
correspondingJsonAttribute;

No. The json type is just for JDBC so that Hibernate knows how to handle that JDBC object when setting a parameter on a PreparedStatement or when fetching a ResultSet.

Do I get any more features from V5.2.10 that support JSON columns?

No, but you just need to supply your own JSON type.

You can just use the hibernate-types which is available on Maven Central.

<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-52</artifactId>
    <version>${hibernate-types.version}</version>
</dependency>

And use the provided JdonType from Hibernate Types as it works on MySQL, PostgreSQL, Oracle, SQL Server or H2 without doing any modifications.

Upvotes: 5

Related Questions