4
4
*/
5
5
package org .hibernate .dialect ;
6
6
7
- import com .fasterxml .jackson .core .JsonFactory ;
8
7
import com .fasterxml .jackson .core .JsonParser ;
9
8
import oracle .jdbc .OracleType ;
10
9
import oracle .jdbc .driver .DatabaseError ;
11
- import oracle .jdbc .provider .oson .OsonFactory ;
12
10
import oracle .sql .json .OracleJsonDatum ;
13
- import oracle .sql .json .OracleJsonFactory ;
14
11
import oracle .sql .json .OracleJsonGenerator ;
15
12
16
- import oracle .sql .json .OracleJsonParser ;
17
13
import org .hibernate .internal .CoreLogging ;
18
14
import org .hibernate .internal .CoreMessageLogger ;
19
15
import org .hibernate .metamodel .mapping .EmbeddableMappingType ;
22
18
import org .hibernate .type .descriptor .WrapperOptions ;
23
19
import org .hibernate .type .descriptor .java .BasicPluralJavaType ;
24
20
import org .hibernate .type .descriptor .java .JavaType ;
21
+ import org .hibernate .type .descriptor .java .spi .UnknownBasicJavaType ;
25
22
import org .hibernate .type .descriptor .jdbc .AggregateJdbcType ;
26
23
import org .hibernate .type .descriptor .jdbc .BasicBinder ;
27
24
import org .hibernate .type .descriptor .jdbc .BasicExtractor ;
28
25
import org .hibernate .type .descriptor .jdbc .JdbcType ;
29
26
import org .hibernate .type .descriptor .jdbc .JsonJdbcType ;
30
- import org .hibernate .type .format .FormatMapper ;
31
27
import org .hibernate .type .format .OsonDocumentReader ;
32
28
import org .hibernate .type .format .OsonDocumentWriter ;
33
29
39
35
import java .sql .ResultSet ;
40
36
import java .sql .SQLException ;
41
37
38
+ import static org .hibernate .dialect .OracleOsonJacksonJdbcType .OSON_JACKSON_FACTORY ;
39
+ import static org .hibernate .dialect .OracleOsonJacksonJdbcType .OSON_JSON_FACTORY ;
40
+
42
41
/**
43
42
*
44
43
* Type mapping of (JSON) array of JSON SQL data type for Oracle database.
@@ -52,8 +51,6 @@ public class OracleOsonJacksonArrayJdbcType extends OracleJsonArrayJdbcType {
52
51
53
52
private static final CoreMessageLogger LOG = CoreLogging .messageLogger ( OracleOsonJacksonArrayJdbcType .class );
54
53
55
- private static final OsonFactory osonFactory = new OsonFactory ();
56
-
57
54
public OracleOsonJacksonArrayJdbcType (JdbcType elementJdbcType ) {
58
55
super (elementJdbcType );
59
56
}
@@ -70,29 +67,31 @@ public <X> ValueBinder<X> getBinder(JavaType<X> javaType) {
70
67
71
68
return new BasicBinder <>( javaType , this ) {
72
69
73
- private <X > byte [] toOsonStream (X value , JavaType <X > javaType , WrapperOptions options ) throws Exception {
70
+ private <T > byte [] toOsonStream (T value , JavaType <T > javaType , WrapperOptions options ) throws Exception {
74
71
final Object [] domainObjects = javaType .unwrap ( value , Object [].class , options );
75
-
76
- ByteArrayOutputStream out = new ByteArrayOutputStream ();
77
- try (OracleJsonGenerator generator = new OracleJsonFactory ().createJsonBinaryGenerator ( out )) {
78
- OsonDocumentWriter writer = new OsonDocumentWriter ( generator );
79
-
80
- if ( getElementJdbcType () instanceof JsonJdbcType jsonElementJdbcType ) {
81
- final EmbeddableMappingType embeddableMappingType = jsonElementJdbcType .getEmbeddableMappingType ();
82
- JsonHelper .serializeArray ( embeddableMappingType , domainObjects , options , writer );
72
+ final ByteArrayOutputStream out = new ByteArrayOutputStream ();
73
+ try (OracleJsonGenerator generator = OSON_JSON_FACTORY .createJsonBinaryGenerator ( out )) {
74
+ final JavaType <?> elementJavaType = ((BasicPluralJavaType <?>) javaType ).getElementJavaType ();
75
+ if ( elementJavaType instanceof UnknownBasicJavaType <?> ) {
76
+ options .getJsonFormatMapper ().writeToTarget ( value , javaType , generator , options );
83
77
}
84
78
else {
85
- assert !( getElementJdbcType () instanceof AggregateJdbcType );
86
- final JavaType <?> elementJavaType = ( (BasicPluralJavaType <?>) javaType ).getElementJavaType ();
87
- JsonHelper .serializeArray (
88
- elementJavaType ,
89
- getElementJdbcType (),
90
- domainObjects ,
91
- options ,
92
- writer
93
- );
79
+ final OsonDocumentWriter writer = new OsonDocumentWriter ( generator );
80
+ if ( getElementJdbcType () instanceof JsonJdbcType jsonElementJdbcType ) {
81
+ final EmbeddableMappingType embeddableMappingType = jsonElementJdbcType .getEmbeddableMappingType ();
82
+ JsonHelper .serializeArray ( embeddableMappingType , domainObjects , options , writer );
83
+ }
84
+ else {
85
+ assert !(getElementJdbcType () instanceof AggregateJdbcType );
86
+ JsonHelper .serializeArray (
87
+ elementJavaType ,
88
+ getElementJdbcType (),
89
+ domainObjects ,
90
+ options ,
91
+ writer
92
+ );
93
+ }
94
94
}
95
- generator .close ();
96
95
return out .toByteArray ();
97
96
}
98
97
@@ -127,20 +126,20 @@ public <X> ValueExtractor<X> getExtractor(JavaType<X> javaType) {
127
126
return new BasicExtractor <>( javaType , this ) {
128
127
129
128
private X fromOson (InputStream osonBytes , WrapperOptions options ) throws Exception {
130
- FormatMapper mapper = options .getJsonFormatMapper ();
131
- OracleJsonParser osonParser = new OracleJsonFactory ().createJsonBinaryParser ( osonBytes );
132
- final JdbcType elementJdbcType = getElementJdbcType ();
133
- if (elementJdbcType instanceof JsonJdbcType ) {
134
- if (((JsonJdbcType ) elementJdbcType ).getEmbeddableMappingType () != null ) {
135
- // embeddable array case.
136
- return JsonHelper .deserializeArray ( javaType ,
137
- elementJdbcType , new OsonDocumentReader ( osonParser ), options );
129
+ if ( ((BasicPluralJavaType <?>) getJavaType ()).getElementJavaType () instanceof UnknownBasicJavaType <?> ) {
130
+ try (JsonParser oParser = OSON_JACKSON_FACTORY .createParser ( osonBytes )) {
131
+ return options .getJsonFormatMapper ().readFromSource ( getJavaType (), oParser , options );
138
132
}
139
133
}
140
- try (JsonParser oParser = ((JsonFactory )osonFactory ).createParser ( osonBytes )) {
141
- return mapper .readFromSource ( getJavaType (), oParser , options );
134
+ else {
135
+ // embeddable array case.
136
+ return JsonHelper .deserializeArray (
137
+ javaType ,
138
+ getElementJdbcType (),
139
+ new OsonDocumentReader ( OSON_JSON_FACTORY .createJsonBinaryParser ( osonBytes ) ),
140
+ options
141
+ );
142
142
}
143
-
144
143
}
145
144
146
145
private X doExtraction (OracleJsonDatum datum , WrapperOptions options ) throws SQLException {
0 commit comments