Coder Social home page Coder Social logo

vladmihalcea / hypersistence-utils Goto Github PK

View Code? Open in Web Editor NEW
2.3K 44.0 365.0 2.45 MB

The Hypersistence Utils library (previously known as Hibernate Types) gives you Spring and Hibernate utilities that can help you get the most out of your data access layer.

License: Apache License 2.0

Java 99.99% Batchfile 0.01%
hibernate hibernate-types java json array enum custom-types hypersistence performance performance-testing

hypersistence-utils's Introduction

Initial examples

My personal blog features some code examples that are included in this repository.

  • customer-lock - contains concurrency examples
  • db-facts - contains DB related examples
  • hibernate-facts - contains various Hibernate examples
  • misc - contains unclassified examples
  • mongodb-facts - contains MongoDB examples

Are you struggling with application performance issues?

Hypersistence Optimizer

Imagine having a tool that can automatically detect if you are using JPA and Hibernate properly. No more performance issues, no more having to spend countless hours trying to figure out why your application is barely crawling.

Imagine discovering early during the development cycle that you are using suboptimal mappings and entity relationships or that you are missing performance-related settings.

More, with Hypersistence Optimizer, you can detect all such issues during testing and make sure you don't deploy to production a change that will affect data access layer performance.

Hypersistence Optimizer is the tool you've been long waiting for!

Training

If you are interested in on-site training, I can offer you my High-Performance Java Persistence training which can be adapted to one, two or three days of sessions. For more details, check out my website.

Consulting

If you want me to review your application and provide insight into how you can optimize it to run faster, then check out my consulting page.

High-Performance Java Persistence Video Courses

If you want the fastest way to learn how to speed up a Java database application, then you should definitely enroll in my High-Performance Java Persistence video courses.

High-Performance Java Persistence Book

Or, if you prefer reading books, you are going to love my High-Performance Java Persistence book as well.

High-Performance Java Persistence book High-Performance Java Persistence video course

hypersistence-utils's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

hypersistence-utils's Issues

Feature request: Abstract class (ie: generic storage)

The json mapper can't work if the defined class is Abstract or Object.
The purpose of jsonb column being to be able to store variable properties objects, it makes sense that the provided code allows storing at least a hierarchy of objects in the same column - or even any object if the Hibernate type is "Object".

To allow this, we could split the storage in 2 derived columns: "<original_name>_object" and "<original_name>_class".

I tried to implement it (doesn't seams so difficult), but couldn't find easily a 5.2 example...

Problem with Java 8 LocalDateTime

I have a Scope class like that

class Scope implements Serializable {
        private String scope;
        private Status status;
        private LocalDateTime expiresAt;
        // ...
 }

and use it to map with a PostgreSQL jsonb column

class Approval implements Serializable {
    @Type(type = "jsonb")
    @Column(columnDefinition = "jsonb")
    private Set<Scope> scopes;
    // ...
}

It works but the data store in jsonb column was

[
  {
    "scope": "all", 
    "status": "APPROVED", 
    "expiresAt": [2018, 9, 14, 9, 35, 28, 909000000]
  }
]

I think it would be better to use ISODate format on that case.

Convert UTF8 String error

When read UTF8 string from mysql json column, result string converting with error:
Original string

[
	{
		"key" : "новый"
	}
]

Bytes
5b0a097b0a0909226b657922203a2022d0bdd0bed0b2d18bd0b9220a097d0a5d

Result string after hibernate request

{"key":"??????????"}
Bytes
7B226B6579223A223F3F3F3F3F3F3F3F3F3F227D

If read varchar column no error occure.

Parse Json from database to JsonNode encoding

com.vladmihalcea hibernate-types-52 2.2.2

@entity
@typedef(
name = "jsonb-node",
typeClass = JsonNodeStringType.class
)
public class Test implements Serializable {
@type(type = "jsonb-node")
@column(columnDefinition = "json")
private JsonNode data;

}

Hello,
First of all congratulations for your work.
I have a problem with the charset when I get the data from the database, the data is stored with utf-8 but when it is read and then passed to JsonNode the encoding is not utf-8.
Is there any way to say that in reading the encoding is utf-8?

thanks

Using JsonBinaryType to handle java.util.ArrayList

Hello,

I'm trying to store a list of String in a PostgreSQL Array. Do to that, I found your library which seems to be solving this problem but I cannot figure out how to use it properly.

I have this

@Type(type = "jsonb")
@Column(columnDefinition = "jsonb")
private List<String> owners = new ArrayList<>();

and the database value is

{foobar}

and I get

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT token

which make sense, as an array would start with [ and not {. But it seems that ARRAY in PostgreSQL are in {} and not [].

Can you help me understand what I'm missing? Seems pretty obvious, but I cannot see it.

ERROR: column "location" is of type json but expression is of type character varying

I'm trying to use JsonStringType, here's how I use it:

@Entity
@Table(name = "participants")
@TypeDefs({
        @TypeDef(name = "json", typeClass = JsonStringType.class),
        @TypeDef(name = "jsonb", typeClass = JsonBinaryType.class),
})
public class Participant extends BaseEntity {

    private String name;

    @Type(type = "json")
    @Column(columnDefinition = "json")
    @Basic(fetch = FetchType.LAZY)
    private List<Ticket> tickets;

}

But I get the following error:

Caused by: org.postgresql.util.PSQLException: ERROR: column "tickets" is of type json but expression is of type character varying
Hint: You will need to rewrite or cast the expression.
Position: 55

So to make sure if there's something missing in my code, I tried to run the test PostgreSQLJsonStringTypeTest. However to make it similar to my code I had to change the following:

    @Entity(name = "Event")
    @Table(name = "event")
    public static class Event extends BaseEntity {

        @Type(type = "json") // It was jsonb. But why?
        @Column(columnDefinition = "json")
        private Location location;

    }
    // Same for `Participant` entity!

And the test failed with the same error:

ERROR: column "location" is of type json but expression is of type character varying

It seems that for some reason JsonStringType does not work properly. (Or what am I missing?). Thanks.

Add support for PostgreSQL Interval column type

Hi Vlad,

I have a custom type for PGIntervals that I map to a Java duration. This is for example useful to map result sets of native queries that subtract one timestamp for another. Let me know if there's interest in adding it to the custom type library:

public class PGIntervalType implements UserType {

    public static final PGIntervalType INSTANCE = new PGIntervalType();

    public Class<?> returnedClass() {
        return Duration.class;
    }


    public int[] sqlTypes() {
        return new int[] {Types.OTHER};
    }


    @Override
    public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) throws HibernateException {
        try {
            final PGInterval pgi = (PGInterval) rs.getObject(names[0]);
            final int days = pgi.getDays();
            final int hours = pgi.getHours();
            final int mins = pgi.getMinutes();
            final double secs = pgi.getSeconds();

            return Duration.ofDays(days)
                .plus(hours, ChronoUnit.HOURS)
                .plus(mins, ChronoUnit.MINUTES)
                .plus(Math.round(secs), ChronoUnit.SECONDS);

        }
        catch (Exception e) {
            return null;
        }
    }


    @Override
    public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session) throws HibernateException, SQLException {
        if (value == null) {
            st.setNull(index, Types.OTHER);
        }
        else {
            final Duration period = ((Duration)value);
            final int days = (int) period.toDays();
            final int hours = (int) (period.toHours() - days * 24);
            final int mins = (int) (period.toMinutes() - period.toHours() * 60);
            final int secs = (int) (period.getSeconds() - mins * 60);

            final PGInterval pgi = new PGInterval(0, 0, days, hours, mins, secs);
            st.setObject(index, pgi);
        }
    }


    public boolean equals(Object x, Object y)
        throws HibernateException {

        return x == y;
    }


    public int hashCode(Object x)
        throws HibernateException {
        return x.hashCode();
    }


    public Object deepCopy(Object value)
        throws HibernateException {
        return value;
    }


    public boolean isMutable() {
        return false;
    }


    public Serializable disassemble(Object value)
        throws HibernateException {
        return (Serializable) value;
    }


    public Object assemble(Serializable cached, Object owner)
        throws HibernateException {
        return cached;
    }


    public Object replace(Object original, Object target, Object owner)
        throws HibernateException {
        return original;
    }

}

Polymorphic List

I'm trying to create a List with polymorphic to a jsonb without success!

  • I have no objectMapper custom configuration
  • Normal List and String List works.
  • Polymorphic without List works just fine

The action column retains de @Class property in json, the actions columns does not!

Source:

@Data
@Entity
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "orders")
@EntityListeners(AuditingEntityListener.class)
@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
public class Order implements Identifiable<Long> {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Type(type = "jsonb")
    @Column(columnDefinition = "jsonb")
    private Action action; // Works fine

    @Type(type = "jsonb")
    @Column(columnDefinition = "jsonb")
    private List<Action> actions; // Doens't work

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class OrderDetail implements Serializable {
        private String content;
        private Integer amount;
    }

    @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
    public interface Action extends Serializable {
        String getOperation();
    }

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Add implements Action {
        private String operation;
    }


    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Remove implements Action {
        private String operation;
        private String other;
    }
}

Jackson serialization exception for range

There is a problem when using the new ranges that was just recently merged with master #64 and the problem was due to no public getters/setters in the Range class.

I'm happy to fix it if allowed. I've fixed it locally by adding getters and setters for the upper and lower limits.

Compilation failure on fresh mvn clean install - not able to build locally

Hi there,

I wanted to try out developing a new type and share a PR. One of my projects got that type in the code, so I thought I could share it here.

The problem is I cannot proceed with building it locally on my mac:

Java version: jdk1.8.0_152
Maven version: 3.5.4
OS name: "mac os x", version: "10.13.5"

Steps to reproduce:

  1. fork and clone
  2. cd hibernate-types
  3. mvn clean install

Any clue what it could be? How about writing "How to Contribute" article in the repo with prerequisites? I added the stacktrace at the bottom, although there is no detailed info what failed with -X and -e flags

Thanks in advance,
Luke

Stacktrace:

[DEBUG] incrementalBuildHelper#afterRebuildExecution
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] Hibernate Types 2.2.3-SNAPSHOT ..................... SUCCESS [  1.085 s]
[INFO] hibernate-types-4 .................................. FAILURE [  1.216 s]
[INFO] hibernate-types-43 ................................. SKIPPED
[INFO] hibernate-types-5 .................................. SKIPPED
[INFO] hibernate-types-52 2.2.3-SNAPSHOT .................. SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.615 s
[INFO] Finished at: 2018-06-24T15:24:49+02:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.3:compile (default-compile) on project hibernate-types-4: Compilation failure -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.3:compile (default-compile) on project hibernate-types-4: Compilation failure
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:213)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:154)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:146)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
    at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
    at org.apache.maven.cli.MavenCli.execute (MavenCli.java:954)
    at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:288)
    at org.apache.maven.cli.MavenCli.main (MavenCli.java:192)
    at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke (Method.java:498)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:289)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:229)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:415)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:356)
Caused by: org.apache.maven.plugin.compiler.CompilationFailureException: Compilation failure
    at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute (AbstractCompilerMojo.java:915)
    at org.apache.maven.plugin.compiler.CompilerMojo.execute (CompilerMojo.java:129)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:208)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:154)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:146)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
    at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
    at org.apache.maven.cli.MavenCli.execute (MavenCli.java:954)
    at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:288)
    at org.apache.maven.cli.MavenCli.main (MavenCli.java:192)
    at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke (Method.java:498)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:289)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:229)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:415)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:356)
[ERROR] 
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
[ERROR] 
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR]   mvn <goals> -rf :hibernate-types-4

@JsonIgnoreProperties(ignoreUnknown = true) seems to be ignored

Hi

We are using this library in our system and we ran into the following issue. It seems that fasterXML annotations such as @JsonIgnoreProperties(ignoreUnknown = true) seem to be ignored, making deserialization fail. Is this behaviour as intended (I do not know with my limited jackson/fasterXML knowledge).

Kind regards,
Jelmer

JBoss throws ClassCastException: org.hibernate.annotations.common.reflection.java.JavaXProperty cannot be cast to org.hibernate.annotations.common.reflection.XProperty

Hi there!
I'm trying to use your types but when I build it I get this exception:

msc.service.StartException in service jboss.persistenceunit."server-api.war#dgo": javax.persistence.PersistenceException: [PersistenceUnit: db-test] Unable to build Hibernate SessionFactory server-api_1 | at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:179) server-api_1 | at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:121) server-api_1 | at org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:667) server-api_1 | at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:193) server-api_1 | at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) server-api_1 | at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) server-api_1 | at java.lang.Thread.run(Thread.java:748) server-api_1 | at org.jboss.threads.JBossThread.run(JBossThread.java:320) server-api_1 | Caused by: javax.persistence.PersistenceException: [PersistenceUnit: dgo] Unable to build Hibernate SessionFactory server-api_1 | at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:954) server-api_1 | at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:882) server-api_1 | at org.jboss.as.jpa.hibernate5.TwoPhaseBootstrapImpl.build(TwoPhaseBootstrapImpl.java:44) server-api_1 | at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:161) server-api_1 | ... 7 more server-api_1 | Caused by: org.hibernate.MappingException: Could not instantiate Type: com.vladmihalcea.hibernate.type.json.JsonBinaryType server-api_1 | at org.hibernate.type.TypeFactory.type(TypeFactory.java:139) server-api_1 | at org.hibernate.type.TypeFactory.byClass(TypeFactory.java:109) server-api_1 | at org.hibernate.type.TypeResolver.heuristicType(TypeResolver.java:112) server-api_1 | at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:416) server-api_1 | at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:398) server-api_1 | at org.hibernate.mapping.Property.isValid(Property.java:225) server-api_1 | at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:595) server-api_1 | at org.hibernate.mapping.RootClass.validate(RootClass.java:265) server-api_1 | at org.hibernate.boot.internal.MetadataImpl.validate(MetadataImpl.java:329) server-api_1 | at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:443) server-api_1 | at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:879) server-api_1 | ... 9 more server-api_1 | Caused by: java.lang.ClassCastException: org.hibernate.annotations.common.reflection.java.JavaXProperty cannot be cast to org.hibernate.annotations.common.reflection.XProperty server-api_1 | at com.vladmihalcea.hibernate.type.json.internal.JsonTypeDescriptor.setParameterValues(JsonTypeDescriptor.java:58) server-api_1 | at com.vladmihalcea.hibernate.type.json.JsonBinaryType.setParameterValues(JsonBinaryType.java:66) server-api_1 | at org.hibernate.type.TypeFactory.injectParameters(TypeFactory.java:152) server-api_1 | at org.hibernate.type.TypeFactory.type(TypeFactory.java:135) server-api_1 | ... 19 more

Not sure it's a bug on your lib or something I'm missing, any help?
Thanks

Custom deserializer for collection

Hi,
First, great job on this lib, congrats !

I have a quick question regarding deserialization.
I have an Set of objects which contain more objects inside them (in a structure like this:
Set, where A is an abstract class with 3 different implementations (A1, A2, A3). So in the end I have a set of A1's, that contain a set of A2's which in the end contain a set of A3's).
To correctly create a collection of those objects I would need to write a custom converter, with some business logic inside.
Is it possible to override you default behaviour JsonTypeDescriptor ?

Convert JSON from MySQL to UTF-8

Could not deserialize values from mysql json column with utf-8 encoding.
Example
@ TypeDef( name = "jsonb-node", typeClass = JsonStringType.class )
public class Catalog {
...
@ Type( type = "jsonb-node" )
@ Column(columnDefinition = "json")
public ArrayNode tags;
...
List<Catalog> catalog = em.createNativeQuery("select * from Catalog c ",Catalog.class).getResultList();
The result is
"tags":[{"key":"??????????","value":"????????????"},{"key":"new","value":"template"}]

Exception UNION could not convert type for inheritance hierarchies with JsonStringType

Given an class hierarchy with entities B and C that both extend base class A, when C has a property mapped with JsonStringType, and one queries all A using SELECT a FROM A a, the query fails with the following exception:

org.hibernate.exception.SQLGrammarException: could not extract ResultSet (3a7690e6-4840-4004-89d2-479af6a72963): javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
Caused by: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
Caused by: org.postgresql.util.PSQLException: ERROR: UNION could not convert type json to uuid
  Position: 579

The error is caused by the fact that the produced SQL query has the following format: (I slightly simplified it to only include the relevant part)

SELECT b.*, null::uuid as properties FROM B b UNION ( select c.*, c.properties from C c)

The ::uuid cast originates from PostgreSQL81Dialect#getSelectClauseNullString(sqlType), which returns uuid for input 1111 (which is Types.OTHER). So it seems somehow, OTHER is already bound to uuid, and the work around performed by Hibernate does not work anymore (a better workaround would probably be to consider the columnDefinition of the column as well).

I'm uncertain whether this workaround is still required, but all new dialects (I am using the PostgreSQL95Dialect) still extend from the PostgreSQL81Dialect without overriding getSelectClauseNullString method. Furthermore, I am aware that this issue should probably be fixed in Hibernate rather than here. This method will in fact break for all queries using a null value of a type for which its JDBC type is mapped to multiple types.

Nevertheless, I've had success with mapping my JSON properties to Types.JAVA_OBJECT rather than Types.OTHER. This type is not subject to the bug for me. Types.JAVA_OBJECT is also the JDBC type of choice as of the PostgreSQL92Dialect.

Is there any particular reason to not switch the JDBC type of JsonStringType to Types.JAVA_OBJECT?

Add EnumSet as bitfield support

Hi

Java recommends using EnumSets as bitfield or flags enums where every enum entry has its dedicated bit.
Can you add an example how an EnumSet inside an entity can be mapped to an integer column instead of having a 1:n relation?

Kind regards,
Michael

Provide a way to customize the deep copy mechanism

There is a method
static T clone(T value)
in class JacksonUtil
which try to determine what type of deep copy use and in case if input Object implements Serializable interface it try to use java Serialization mechanism to copy object. But what if i use ArrayList to store it to DB and MyObject is not implements it. Why just for all cases not use json serialization?
Can you do it preferable may be. Because it always fails with exception and force me to mark my Object as Serializable. But it is not what i want

Use newer JSON-P & JSON-B standards as alternative to Jackson

Jackson is being obsoleted by JSON-P & JSON-B, and the Java community will be moving forward with the industry standards.

It would be nice to see JSON-P's JsonObject or JsonStructure used instead of Jackson's JsonNode.

It is also possible that adding in JSON-B could allow for typesafe population of POJOs from PostgreSQL jsonb columns, but I can't speak as to whether Hibernate could allow for this level of generics, although I would think it could.

Could not load requested class

I am getting the following error:

	at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:348) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at org.hibernate.boot.internal.ClassLoaderAccessImpl.classForName(ClassLoaderAccessImpl.java:62) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at org.hibernate.cfg.annotations.SimpleValueBinder.fillSimpleValue(SimpleValueBinder.java:538) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at org.hibernate.cfg.SetSimpleValueTypeSecondPass.doSecondPass(SetSimpleValueTypeSecondPass.java:25) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1640) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1598) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:278) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:861) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:888) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:57) ~[spring-orm-5.0.6.RELEASE.jar:5.0.6.RELEASE]
	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.0.6.RELEASE.jar:5.0.6.RELEASE]
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:390) ~[spring-orm-5.0.6.RELEASE.jar:5.0.6.RELEASE]
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:377) ~[spring-orm-5.0.6.RELEASE.jar:5.0.6.RELEASE]
	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) ~[spring-orm-5.0.6.RELEASE.jar:5.0.6.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1765) ~[spring-beans-5.0.6.RELEASE.jar:5.0.6.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1702) ~[spring-beans-5.0.6.RELEASE.jar:5.0.6.RELEASE]
	... 66 common frames omitted
Caused by: java.lang.ClassNotFoundException: Could not load requested class : string-array
	at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl$AggregatedClassLoader.findClass(ClassLoaderServiceImpl.java:336) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_181]
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_181]
	at java.lang.Class.forName0(Native Method) ~[na:1.8.0_181]
	at java.lang.Class.forName(Class.java:348) ~[na:1.8.0_181]
	at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:345) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	... 81 common frames omitted

Any suggestions? I will update if I work out myself 👍

Issue with jackson-databind version 2.9.0

Hi,

I have dependencies of jackson-databind with version 2.9.0 in my project and I am getting an exception with stacktrace
com.vladmihalcea.hibernate.type.json.internal.AbstractJsonSqlTypeDescriptor$1.doExtract(AbstractJsonSqlTypeDescriptor.java:34)
at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:47)
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:238)
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:234)
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:224)
at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:300)
at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2727)
at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1729)
at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1655)
at org.hibernate.loader.Loader.getRow(Loader.java:1544)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:727)
at org.hibernate.loader.Loader.processResultSet(Loader.java:972)
at org.hibernate.loader.Loader.doQuery(Loader.java:930)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:336)
at org.hibernate.loader.Loader.doList(Loader.java:2617)
at org.hibernate.loader.Loader.doList(Loader.java:2600)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2429)
at org.hibernate.loader.Loader.list(Loader.java:2424)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:501)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:371)
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1326)
at org.hibernate.internal.QueryImpl.list(QueryImpl.java:87)
at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:606)
at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:483)

Thanks,
Arpit

ObjectMapperSupplier implementation never loaded

Summary
A custom ObjectMapperSupplier implementation is not loaded on startup.

Steps to reproduce

  1. Create a custom ObjectMapperSupplier implementation that enables serialization features
  2. Register the implementation with the hibernate.types.jackson.object.mapper setting in your application.yml file
  3. Run the application

Expected results
The enabled serialization features are honored when retrieving json types from the database.

Actual results
The enabled serialization features are not honored when retrieving json types from the database.


More info

When I add a throw new RuntimeException(); in the implementation's get() method it fails to throw on startup so I know the body is never run.

My application.yml is as follows:

spring:
  profiles:
    active: dev
  rabbitmq:
    listener:
      simple:
        concurrency: 32
        max-concurrency: 48
        prefetch: 16
        acknowledge-mode: auto
        default-requeue-rejected: true
        retry:
          enabled: true
          multiplier: 2
          max-attempts: 10
          stateless: true
          initial-interval: 1s
          max-interval: 30s
  jpa:
    database-platform: org.hibernate.dialect.MySQLDialect
    hibernate:
      ddl-auto: none
      naming:
        implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    properties:
      hibernate.generate_statistics: false
      hibernate.cache.use_query_cache: true
      hibernate.cache.use_second_level_cache: false
      hibernate.cache.region.factory_class: org.hibernate.cache.ehcache.EhCacheRegionFactory
      hibernate.types.jackson.object.mapper: net.zuluconnect.ZuluconnectObjectMapperSupplier
      hibernate.jdbc.batch_size: 20
      hibernate.jdbc.batch_versioned_data: true
      hibernate.order_inserts: true
      hibernate.order_updates: true
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: org.mariadb.jdbc.Driver
    hikari:
      minimum-idle: 32
      maximum-pool-size: 48
      idle-timeout: 60000

A separate profile-based configuration application-dev.yml is also loaded:

spring:
  rabbitmq:
    host: "0.0.0.0"
    username: guest
    password: guest
  datasource:
    url: jdbc:mariadb://localhost:3306/my_db
    hikari:
      username: root
      password:
logging:
  level:
    org: DEBUG

And my ObjectMapperSupplier implementation:

package net.zuluconnect;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.vladmihalcea.hibernate.type.util.ObjectMapperSupplier;

@SuppressWarnings("unused")
public class ZuluconnectObjectMapperSupplier implements ObjectMapperSupplier {

    @Override
    public ObjectMapper get() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
        objectMapper.configure(DeserializationFeature.ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT, true);
        objectMapper.configure(DeserializationFeature.USE_LONG_FOR_INTS, true);
        return objectMapper;
    }
}

Support for Matrix persistence

Hi there!

Great project!

Would be great if there is support to add a String matrix, like String[][] and not just String[].

Error trying to serialize jsonB property in v1.1.2

Hi,
I'm using hibernate-types-52 with jsonB types with success in version 1.1.1.
I'm using Spring boot 1.5.8 with Java 8.
When I try to upgrade to 1.1.2 but it gives me serialization issues.
This might be related with issues #6 and #8 since the error is in Set<MerchantChannel> channels

pom

...
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>${postgresql.version}</version>
        </dependency>
        <dependency>
            <groupId>com.vladmihalcea</groupId>
            <artifactId>hibernate-types-52</artifactId>
            <version>1.1.2</version>
        </dependency>
...

application.yml

spring:
    url: jdbc:postgresql://localhost/my-db
    username: postgres
    password: postgres
    driver-class-name: org.postgresql.Driver
@NoArgsConstructor( access = AccessLevel.PACKAGE )
@AllArgsConstructor( access = AccessLevel.PACKAGE )
@Entity
@Data
@Table( name = "merchants" )
@EqualsAndHashCode( of = { "id" }, callSuper = false )
@TypeDef( name = "jsonb", typeClass = JsonBinaryType.class )
@Builder
public class Merchant implements IdentifiableResource<String> {

	@Id
	@GeneratedValue( generator = "UUID" )
	@GenericGenerator( name = "UUID", strategy = "org.hibernate.id.UUIDGenerator" )
	private String id;

	@Type( type = "jsonb" )
	@Column( columnDefinition = "jsonb" )
	private MerchantProfile profile;

	@Type( type = "jsonb" )
	@Column( columnDefinition = "jsonb" )
	private Set<MerchantChannel> channels;

}

@Data
@Builder
public class MerchantChannel {

	private ChannelType type;

	private ChannelData data;

	private boolean created;
}

public enum ChannelType {

	MBWAY, PAYPAL, VISA;

	private final ChannelTypeOperationValidator validator;

	ChannelType() {
		this.validator = null;
	}

	public boolean isOperationValid( OperationType operationType ) {
		return validator.isAllowed( operationType );
	}
}

@FunctionalInterface
public interface ChannelTypeOperationValidator {

	boolean isAllowed( OperationType type );
}

public enum OperationType {

	PAY,
	REFUND,
	ABORTS,
	AUTH,
	PAY_AFTER_AUTH,
	CANCEL_AUTH

}

public class ChannelData extends HashMap<String, Object> implements Serializable {

	private static final long serialVersionUID = -2228309351866351977L;
	
	public ChannelData() {
		this( Collections.emptyMap() );
	}
	
	public ChannelData( Map<String, Object> data ) {
		super( data );
	}
}
org.springframework.orm.jpa.JpaSystemException: could not serialize; nested exception is org.hibernate.type.SerializationException: could not serialize
	at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:333)
	at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:244)
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:488)
	at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59)
	at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)
	at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:147)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:133)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:57)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
	at com.sun.proxy.$Proxy156.save(Unknown Source)
	at com.cmas.systems.channels.integrations.endpoints.merchant.MerchantService.create(MerchantService.java:44)
	at com.cmas.systems.channels.integrations.endpoints.merchant.web.MerchantEndpoints.create(MerchantEndpoints.java:51)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:841)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1650)
	at org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:206)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637)
	at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637)
	at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:110)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317)
	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127)
	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:114)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
	at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
	at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
	at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
	at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilterInternal(BasicAuthenticationFilter.java:215)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
	at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
	at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
	at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
	at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214)
	at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177)
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637)
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637)
	at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:105)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637)
	at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637)
	at org.springframework.cloud.sleuth.instrument.web.TraceFilter.doFilter(TraceFilter.java:145)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637)
	at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:106)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637)
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:533)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
	at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:524)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:190)
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1595)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:188)
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1253)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:168)
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473)
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1564)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:166)
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1155)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
	at org.eclipse.jetty.server.Server.handle(Server.java:564)
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:317)
	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:251)
	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:279)
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:110)
	at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:124)
	at org.eclipse.jetty.util.thread.Invocable.invokePreferred(Invocable.java:128)
	at org.eclipse.jetty.util.thread.Invocable$InvocableExecutor.invoke(Invocable.java:222)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:294)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.produce(EatWhatYouKill.java:126)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:673)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:591)
	at java.lang.Thread.run(Thread.java:745)
Caused by: org.hibernate.type.SerializationException: could not serialize
	at org.hibernate.internal.util.SerializationHelper.serialize(SerializationHelper.java:119)
	at org.hibernate.internal.util.SerializationHelper.serialize(SerializationHelper.java:144)
	at org.hibernate.internal.util.SerializationHelper.clone(SerializationHelper.java:75)
	at com.vladmihalcea.hibernate.type.json.internal.JacksonUtil.clone(JacksonUtil.java:44)
	at com.vladmihalcea.hibernate.type.json.internal.JsonTypeDescriptor$1.deepCopyNotNull(JsonTypeDescriptor.java:22)
	at org.hibernate.type.descriptor.java.MutableMutabilityPlan.deepCopy(MutableMutabilityPlan.java:35)
	at org.hibernate.type.AbstractStandardBasicType.deepCopy(AbstractStandardBasicType.java:283)
	at org.hibernate.type.AbstractStandardBasicType.deepCopy(AbstractStandardBasicType.java:279)
	at org.hibernate.type.TypeHelper.deepCopy(TypeHelper.java:51)
	at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:264)
	at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:178)
	at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:121)
	at org.hibernate.jpa.event.internal.core.JpaPersistEventListener.saveWithGeneratedId(JpaPersistEventListener.java:67)
	at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:189)
	at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:132)
	at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:58)
	at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:775)
	at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:748)
	at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:753)
	at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1146)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:347)
	at com.sun.proxy.$Proxy150.persist(Unknown Source)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:298)
	at com.sun.proxy.$Proxy150.persist(Unknown Source)
	at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:508)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:504)
	at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:489)
	at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:461)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:56)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
	... 115 common frames omitted
Caused by: java.io.NotSerializableException: com.cmas.systems.channels.integrations.endpoints.merchant.MerchantChannel
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
	at java.util.HashSet.writeObject(HashSet.java:287)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1028)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
	at org.hibernate.internal.util.SerializationHelper.serialize(SerializationHelper.java:115)
	... 162 common frames omitted

Error with Type erasure and clone method

This method breaks when trying to clone java.util.List and java.util.Map top level attributes. Maybe use serialization to create a deep copy, ex:

    public static <T> T clone(T value) {
        try {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bos);
            oos.writeObject(value);
            oos.flush();
            oos.close();
            bos.close();

            ByteArrayInputStream bais = new ByteArrayInputStream(bos.toByteArray());
            return (T) new ObjectInputStream(bais).readObject();
        } catch (ClassNotFoundException | IOException ex) {
            throw new HibernateException(ex);
        }
    }

My current work around is to encapsulate such attributes on wrapper classes. Maybe there are other ways to go like MixIns or Type annotations, but I have not tried / don't know how to do those.

Suggestions?

String fields on entity as JSONB don't work correctly

Hi,

we've recently discovered that String fields in entities don't work correctly with JSONB as a type. While data is persisted and can be read, jsonb operators like the ones from Postgres (e.g. column->>'field' ) won't work, which is a massive loss of functionality. The reason for this is that their not really persisted as valid JSONB. E.g. the String send to the database is the following:

"{\"country\":\"Romania\",\"city\":\"Cluj-Napoca\"}"

While it should be this:

{"country":"Romania","city":"Cluj-Napoca"}

The following patch should replicate the problem:

diff --git a/hibernate-types-52/src/test/java/com/vladmihalcea/hibernate/type/json/PostgreSQLJsonStringTypeTest.java b/hibernate-types-52/src/test/java/com/vladmihalcea/hibernate/type/json/PostgreSQLJsonStringTypeTest.java
index 30226a0..c40ee3d 100644
--- a/hibernate-types-52/src/test/java/com/vladmihalcea/hibernate/type/json/PostgreSQLJsonStringTypeTest.java
+++ b/hibernate-types-52/src/test/java/com/vladmihalcea/hibernate/type/json/PostgreSQLJsonStringTypeTest.java
@@ -1,5 +1,6 @@
 package com.vladmihalcea.hibernate.type.json;

+import com.vladmihalcea.hibernate.type.json.internal.JacksonUtil;
 import com.vladmihalcea.hibernate.type.model.BaseEntity;
 import com.vladmihalcea.hibernate.type.model.Location;
 import com.vladmihalcea.hibernate.type.model.Ticket;
@@ -15,6 +16,7 @@ import java.util.List;
 import java.util.concurrent.atomic.AtomicReference;

 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;

 /**
  * @author Vlad Mihalcea
@@ -56,6 +58,7 @@ public class PostgreSQLJsonStringTypeTest extends AbstractPostgreSQLIntegrationT
             participant.setId(1L);
             participant.setTicket(ticket);
             participant.setEvent(event);
+            participant.setMetaData(JacksonUtil.toString(location));

             entityManager.persist(participant);

@@ -75,10 +78,17 @@ public class PostgreSQLJsonStringTypeTest extends AbstractPostgreSQLIntegrationT
                             "where p.ticket ->> 'price' > '10'")
                     .getResultList();

+            participant.setMetaData(JacksonUtil.toString(location));

             entityManager.persist(participant);

@@ -75,10 +80,18 @@ public class PostgreSQLJsonStringTypeTest extends AbstractPostgreSQLIntegrationT
                             "where p.ticket ->> 'price' > '10'")
                     .getResultList();

+            List<String> countries = entityManager.createNativeQuery(
+                    "select p.metadata->>'country' " +
+                            "from participant p ")
+                    .getResultList();
+
             event.getLocation().setCity("Constan<C8>");
             entityManager.flush();

             assertEquals(1, participants.size());
+            assertEquals(1, countries.size());
+            assertNotNull(countries.get(0));
         });
     }

@@ -110,6 +120,10 @@ public class PostgreSQLJsonStringTypeTest extends AbstractPostgreSQLIntegrationT
         @ManyToOne
         private Event event;

+        @Type(type = "jsonb")
+        @Column(columnDefinition = "jsonb")
+        private String metaData;
+
         public Ticket getTicket() {
             return ticket;
         }
@@ -125,6 +139,15 @@ public class PostgreSQLJsonStringTypeTest extends AbstractPostgreSQLIntegrationT
         public void setEvent(Event event) {
             this.event = event;
         }
+
+        public String getMetaData() {
+            return metaData;
+        }
+
+        public void setMetaData(String metaData) {
+            this.metaData = metaData;
+        }
+
     }

I believe the main reason for this is that an already valid JSON string goes through JacksonUtil.toString() again and thus ends up with backslashes in it.

Cheers,
Christoph

Cannot be transformed to Json object

Hi all,

I'm using hibernate-types to serialize/deserialize list of my object with MySQL as below:

public class DefaultMessage {
    # few properties here with its getter/setter
}

public class Project {
    @Type(type = "json")
    @Column(name = "default_messages", columnDefinition = "json")
    private List<DefaultMessage> defaultMessages;

    # Getter/setter
}

Of course, I have defined map supper class and @typedef but it always return cannot be transformed to Json object.

Exception:

2018-05-29 19:00:10,343 WARN  [http-nio-8088-exec-4] ? (:) - The given string value: [B@4ad8cfea cannot be transformed to Json object
java.lang.IllegalArgumentException: The given string value: [B@4ad8cfea cannot be transformed to Json object
	at com.vladmihalcea.hibernate.type.util.ObjectMapperWrapper.fromString(ObjectMapperWrapper.java:52) ~[hibernate-types-52-2.2.1.jar:?]
	at com.vladmihalcea.hibernate.type.json.internal.JsonTypeDescriptor.fromString(JsonTypeDescriptor.java:87) ~[hibernate-types-52-2.2.1.jar:?]
	at com.vladmihalcea.hibernate.type.json.internal.JsonTypeDescriptor.wrap(JsonTypeDescriptor.java:110) ~[hibernate-types-52-2.2.1.jar:?]
	at com.vladmihalcea.hibernate.type.json.internal.AbstractJsonSqlTypeDescriptor$1.doExtract(AbstractJsonSqlTypeDescriptor.java:34) ~[hibernate-types-52-2.2.1.jar:?]
	at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:47) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:261) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:257) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:247) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:333) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2868) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1747) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1673) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at org.hibernate.loader.Loader.getRow(Loader.java:1562) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:732) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at org.hibernate.loader.Loader.processResultSet(Loader.java:991) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at org.hibernate.loader.Loader.doQuery(Loader.java:949) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:341) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at org.hibernate.loader.Loader.doList(Loader.java:2692) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at org.hibernate.loader.Loader.doList(Loader.java:2675) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2507) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at org.hibernate.loader.Loader.list(Loader.java:2502) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:502) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:392) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1490) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1445) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1414) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
	at org.hibernate.query.internal.AbstractProducedQuery.getSingleResult(AbstractProducedQuery.java:1463) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
Caused by: com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'B': was expecting ('true', 'false' or 'null')

Can you give me few suggestions to solve problem?

Thank you!

Java Enum to PostgreSQL Enum (method override problem)

nullSafeSet() in com.vladmihalcea.hibernate.type.basic.PostgreSQLEnumType is never triggered.
It seems that the currently implemented PostgreSQLEnumType doesn't have the proper method definition to override its parent (org.hibernate.type.EnumType).

Current:

public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementorsession) throws HibernateException, SQLException

Should be:

public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session) throws HibernateException, SQLException

Note that the class SharedSessionContractImplementor cannot be found in my implementation.

Migrate to java 9

Good morning. I can't migrate my project to Java 9 because hibernate.types.52 is incorrect module name.
Do you plan to rename the packages?

Serialization problem when using JsonNodeBinaryType and Hibernate 2nd-level cache

Hi Vlad

Congrats to you project! I found your suggestions very helpful!

One small issue I noticed, when using the JsonNodeBinaryType. When I turn on Hibernate 2nd level cache through the following two properties:

hibernate.cache.use_second_level_cache=true hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory

Then I get the following exception:
java.lang.ClassCastException: com.fasterxml.jackson.databind.node.ObjectNode cannot be cast to java.io.Serializable at org.hibernate.type.descriptor.java.MutableMutabilityPlan.disassemble(MutableMutabilityPlan.java:41) at org.hibernate.type.AbstractStandardBasicType.disassemble(AbstractStandardBasicType.java:326) at org.hibernate.type.TypeHelper.disassemble(TypeHelper.java:145) at org.hibernate.cache.spi.entry.StandardCacheEntryImpl.<init>(StandardCacheEntryImpl.java:74) at org.hibernate.persister.entity.AbstractEntityPersister$StandardCacheEntryHelper.buildCacheEntry(AbstractEntityPersister.java:5246) at org.hibernate.persister.entity.AbstractEntityPersister.buildCacheEntry(AbstractEntityPersister.java:4331) at org.hibernate.engine.internal.TwoPhaseLoad.doInitializeEntity(TwoPhaseLoad.java:201) at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:144) at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:1115) at org.hibernate.loader.Loader.processResultSet(Loader.java:973) at org.hibernate.loader.Loader.doQuery(Loader.java:921) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:355) at org.hibernate.loader.Loader.doList(Loader.java:2554) at org.hibernate.loader.Loader.doList(Loader.java:2540) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2370) at org.hibernate.loader.Loader.list(Loader.java:2365) at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:497) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:387) at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:236) at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1300) at org.hibernate.internal.QueryImpl.list(QueryImpl.java:103)

Any idea how to get around this?
Thanks

Returning List<LikedHashMap> for the type List<UserType>

Hi,
I am using the library to cast JSON from DB to a List object like this.


@Column(columnDefinition = "json", name = "USERTYPE")
    @Type(type = "json")
    private List<UserType> userType; 

public class UserType implements Serializable { 
    
private FunctionEnum key;
    private List<Users> users

    public UserType(){

    }
 public FunctionEnum getKey() {
        return coefficientKey;
    }

    public List<User> getUser() {
        return user;
    }
}
public class User {

    private String name

    private Integer value

    public String getName() {
        return name;
    }

    public Integer getValue() {
        return value;
    }

}

Any help why I am getting a return of List<LikedHashMap> not of List<UserType>

Map

Hi, I have DTO have the field
`
@type(type = "string-array")

@column(columnDefinition = "text[]")

private List tagIds = new ArrayList<>();
`

When I session.saveOrUpdate(faqSource);,

I got Exceptions:
18:35:50.806 ERROR c.w.c.f.w.s.e.ServiceExceptionResolver [COMPANY] java.util.ArrayList cannot be cast to [Ljava.lang.Object;
java.lang.ClassCastException: java.util.ArrayList cannot be cast to [Ljava.lang.Object;
at com.vladmihalcea.hibernate.type.array.internal.ArrayUtil.deepCopy(ArrayUtil.java:38) ~[hibernate-types-43-2.3.0.jar:na]
at com.vladmihalcea.hibernate.type.array.internal.AbstractArrayTypeDescriptor$1.deepCopyNotNull(AbstractArrayTypeDescriptor.java:26) ~[hibernate-types-43-2.3.0.jar:na]
at org.hibernate.type.descriptor.java.MutableMutabilityPlan.deepCopy(MutableMutabilityPlan.java:52) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.type.AbstractStandardBasicType.deepCopy(AbstractStandardBasicType.java:321) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.type.AbstractStandardBasicType.deepCopy(AbstractStandardBasicType.java:317) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.type.TypeHelper.deepCopy(TypeHelper.java:67) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:281) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:195) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:138) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:209) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:194) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:114) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:684) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:676) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:671) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]

need your help

Add support to provide an external ObjectMapper

Firstly, greatly appreciate your work on simplifying the json configuration for hibernate.
While using this package with kotlin though, ObjectMapper needs some additional configuration, would you look at externalizing the objectmapper, so it can be configured from outside or re-used.

Thanks again

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.