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