1 package com.vladmihalcea.hibernate.type.json;
2
3 import com.fasterxml.jackson.databind.ObjectMapper;
4 import com.vladmihalcea.hibernate.type.AbstractHibernateType;
5 import com.vladmihalcea.hibernate.type.json.internal.JsonBinarySqlTypeDescriptor;
6 import com.vladmihalcea.hibernate.type.json.internal.JsonTypeDescriptor;
7 import com.vladmihalcea.hibernate.type.util.Configuration;
8 import com.vladmihalcea.hibernate.type.util.ObjectMapperWrapper;
9 import org.hibernate.usertype.DynamicParameterizedType;
10
11 import java.lang.reflect.Type;
12 import java.util.Properties;
13
14 /**
15  * <p>
16  * Maps any given Java object on a JSON column type that is managed via {@link java.sql.PreparedStatement#setObject(int, Object)} at JDBC Driver level.
17  * </p>
18  * <p>
19  * If you are using <strong>PostgreSQL</strong>, you can use this {@link JsonBinaryType} to map both <code>jsonb</code> and <code>json</code> column types.
20  * </p>
21  * <p>
22  * For more details about how to use it, check out <a href="https://vladmihalcea.com/how-to-map-json-objects-using-generic-hibernate-types/">this article</a> on <a href="https://vladmihalcea.com/">vladmihalcea.com</a>.
23  * </p>
24  * <p>
25  * If you want to use a more portable Hibernate <code>Type</code> that can work on <strong>Oracle</strong>, <strong>SQL Server</strong>, <strong>PostgreSQL</strong>, <strong>MySQL</strong>, or <strong>H2</strong> without any configuration changes, then you should use the {@link JsonType} instead.
26  * </p>
27  *
28  * @author Vlad Mihalcea
29  */

30 public class JsonBinaryType
31         extends AbstractHibernateType<Object> implements DynamicParameterizedType {
32
33     public static final JsonBinaryType INSTANCE = new JsonBinaryType();
34
35     public JsonBinaryType() {
36         super(
37             JsonBinarySqlTypeDescriptor.INSTANCE,
38             new JsonTypeDescriptor(Configuration.INSTANCE.getObjectMapperWrapper())
39         );
40     }
41
42     public JsonBinaryType(Type javaType) {
43         super(
44             JsonBinarySqlTypeDescriptor.INSTANCE,
45             new JsonTypeDescriptor(Configuration.INSTANCE.getObjectMapperWrapper(), javaType)
46         );
47     }
48
49     public JsonBinaryType(Configuration configuration) {
50         super(
51             JsonBinarySqlTypeDescriptor.INSTANCE,
52             new JsonTypeDescriptor(configuration.getObjectMapperWrapper()),
53             configuration
54         );
55     }
56
57     public JsonBinaryType(ObjectMapper objectMapper) {
58         super(
59             JsonBinarySqlTypeDescriptor.INSTANCE,
60             new JsonTypeDescriptor(new ObjectMapperWrapper(objectMapper))
61         );
62     }
63
64     public JsonBinaryType(ObjectMapperWrapper objectMapperWrapper) {
65         super(
66             JsonBinarySqlTypeDescriptor.INSTANCE,
67             new JsonTypeDescriptor(objectMapperWrapper)
68         );
69     }
70
71     public JsonBinaryType(ObjectMapper objectMapper, Type javaType) {
72         super(
73             JsonBinarySqlTypeDescriptor.INSTANCE,
74             new JsonTypeDescriptor(new ObjectMapperWrapper(objectMapper), javaType)
75         );
76     }
77
78     public JsonBinaryType(ObjectMapperWrapper objectMapperWrapper, Type javaType) {
79         super(
80             JsonBinarySqlTypeDescriptor.INSTANCE,
81             new JsonTypeDescriptor(objectMapperWrapper, javaType)
82         );
83     }
84
85     public String getName() {
86         return "jsonb";
87     }
88
89     @Override
90     public void setParameterValues(Properties parameters) {
91         ((JsonTypeDescriptor) getJavaTypeDescriptor()).setParameterValues(parameters);
92     }
93
94 }