44 */
55package org .hibernate .dialect ;
66
7- import com .fasterxml .jackson .core .JsonFactory ;
87import com .fasterxml .jackson .core .JsonParser ;
98import oracle .jdbc .OracleType ;
109import oracle .jdbc .driver .DatabaseError ;
11- import oracle .jdbc .provider .oson .OsonFactory ;
1210import oracle .sql .json .OracleJsonDatum ;
13- import oracle .sql .json .OracleJsonFactory ;
1411import oracle .sql .json .OracleJsonGenerator ;
1512
16- import oracle .sql .json .OracleJsonParser ;
1713import org .hibernate .internal .CoreLogging ;
1814import org .hibernate .internal .CoreMessageLogger ;
1915import org .hibernate .metamodel .mapping .EmbeddableMappingType ;
2218import org .hibernate .type .descriptor .WrapperOptions ;
2319import org .hibernate .type .descriptor .java .BasicPluralJavaType ;
2420import org .hibernate .type .descriptor .java .JavaType ;
21+ import org .hibernate .type .descriptor .java .spi .UnknownBasicJavaType ;
2522import org .hibernate .type .descriptor .jdbc .AggregateJdbcType ;
2623import org .hibernate .type .descriptor .jdbc .BasicBinder ;
2724import org .hibernate .type .descriptor .jdbc .BasicExtractor ;
2825import org .hibernate .type .descriptor .jdbc .JdbcType ;
2926import org .hibernate .type .descriptor .jdbc .JsonJdbcType ;
30- import org .hibernate .type .format .FormatMapper ;
3127import org .hibernate .type .format .OsonDocumentReader ;
3228import org .hibernate .type .format .OsonDocumentWriter ;
3329
3935import java .sql .ResultSet ;
4036import java .sql .SQLException ;
4137
38+ import static org .hibernate .dialect .OracleOsonJacksonJdbcType .OSON_JACKSON_FACTORY ;
39+ import static org .hibernate .dialect .OracleOsonJacksonJdbcType .OSON_JSON_FACTORY ;
40+
4241/**
4342 *
4443 * Type mapping of (JSON) array of JSON SQL data type for Oracle database.
@@ -52,8 +51,6 @@ public class OracleOsonJacksonArrayJdbcType extends OracleJsonArrayJdbcType {
5251
5352 private static final CoreMessageLogger LOG = CoreLogging .messageLogger ( OracleOsonJacksonArrayJdbcType .class );
5453
55- private static final OsonFactory osonFactory = new OsonFactory ();
56-
5754 public OracleOsonJacksonArrayJdbcType (JdbcType elementJdbcType ) {
5855 super (elementJdbcType );
5956 }
@@ -70,29 +67,31 @@ public <X> ValueBinder<X> getBinder(JavaType<X> javaType) {
7067
7168 return new BasicBinder <>( javaType , this ) {
7269
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 {
7471 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 );
8377 }
8478 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+ }
9494 }
95- generator .close ();
9695 return out .toByteArray ();
9796 }
9897
@@ -127,20 +126,20 @@ public <X> ValueExtractor<X> getExtractor(JavaType<X> javaType) {
127126 return new BasicExtractor <>( javaType , this ) {
128127
129128 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 );
138132 }
139133 }
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+ );
142142 }
143-
144143 }
145144
146145 private X doExtraction (OracleJsonDatum datum , WrapperOptions options ) throws SQLException {
0 commit comments