1 package com.vladmihalcea.hibernate.type.json;
2
3 import com.fasterxml.jackson.databind.JsonNode;
4 import com.fasterxml.jackson.databind.ObjectMapper;
5 import com.vladmihalcea.hibernate.type.AbstractHibernateType;
6 import com.vladmihalcea.hibernate.type.json.internal.JsonBinarySqlTypeDescriptor;
7 import com.vladmihalcea.hibernate.type.json.internal.JsonNodeTypeDescriptor;
8 import com.vladmihalcea.hibernate.type.util.Configuration;
9 import com.vladmihalcea.hibernate.type.util.ObjectMapperWrapper;
10
11 /**
12  * <p>
13  * Maps a Jackson {@link JsonNode} object on a JSON column type that is managed via {@link java.sql.PreparedStatement#setObject(int, Object)} at JDBC Driver level.
14  * </p>
15  * <p>
16  * For instance, if you are using <strong>PostgreSQL</strong>, you can use the {@link JsonNodeBinaryType} to map both {@code jsonb} and {@code json} column types to a Jackson {@link JsonNode} object.
17  * </p>
18  * <p>
19  * For more details about how to use it, check out <a href="https://vladmihalcea.com/how-to-store-schema-less-eav-entity-attribute-value-data-using-json-and-hibernate/">this article</a> on <a href="https://vladmihalcea.com/">vladmihalcea.com</a>.
20  * </p>
21  * <p>
22  * 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.
23  * </p>
24  *
25  * @author Vlad Mihalcea
26  */

27 public class JsonNodeBinaryType extends AbstractHibernateType<JsonNode> {
28
29     public static final JsonNodeBinaryType INSTANCE = new JsonNodeBinaryType();
30
31     public JsonNodeBinaryType() {
32         super(
33             JsonBinarySqlTypeDescriptor.INSTANCE,
34             new JsonNodeTypeDescriptor(Configuration.INSTANCE.getObjectMapperWrapper())
35         );
36     }
37
38     public JsonNodeBinaryType(Configuration configuration) {
39         super(
40             JsonBinarySqlTypeDescriptor.INSTANCE,
41             new JsonNodeTypeDescriptor(configuration.getObjectMapperWrapper()),
42             configuration
43         );
44     }
45
46     public JsonNodeBinaryType(ObjectMapper objectMapper) {
47         super(
48             JsonBinarySqlTypeDescriptor.INSTANCE,
49             new JsonNodeTypeDescriptor(new ObjectMapperWrapper(objectMapper))
50         );
51     }
52
53     public JsonNodeBinaryType(ObjectMapperWrapper objectMapperWrapper) {
54         super(
55             JsonBinarySqlTypeDescriptor.INSTANCE,
56             new JsonNodeTypeDescriptor(objectMapperWrapper)
57         );
58     }
59
60     public String getName() {
61         return "jsonb-node";
62     }
63 }