@@ -46,14 +46,33 @@ public abstract class AbstractRowReader implements RowReader {
4646 private final List <CollectionReferenceInitializer > arrayReferenceInitializers ;
4747 private final List <CollectionReferenceInitializer > collectionReferenceInitializers ;
4848
49+ // cache map for looking up EntityReferenceInitializer by EntityReference to help with resolving
50+ // bidirectional EntityReference and fetches.
51+ private final Map <EntityReference ,EntityReferenceInitializer > entityInitializerByEntityReference ;
52+
4953 public AbstractRowReader (ReaderCollector readerCollector ) {
50- this .entityReferenceInitializers = readerCollector .getEntityReferenceInitializers () != null
51- ? new ArrayList <EntityReferenceInitializer >( readerCollector .getEntityReferenceInitializers () )
52- : Collections .<EntityReferenceInitializer >emptyList ();
53- this .arrayReferenceInitializers = readerCollector .getArrayReferenceInitializers () != null
54+ if ( CollectionHelper .isNotEmpty ( readerCollector .getEntityReferenceInitializers () ) ) {
55+ entityReferenceInitializers = new ArrayList <EntityReferenceInitializer >(
56+ readerCollector .getEntityReferenceInitializers ()
57+ );
58+ entityInitializerByEntityReference =
59+ new HashMap <EntityReference , EntityReferenceInitializer >( entityReferenceInitializers .size () );
60+ for ( EntityReferenceInitializer entityReferenceInitializer : entityReferenceInitializers ) {
61+ entityInitializerByEntityReference .put (
62+ entityReferenceInitializer .getEntityReference (),
63+ entityReferenceInitializer
64+ );
65+ }
66+ }
67+ else {
68+ entityReferenceInitializers = Collections .<EntityReferenceInitializer >emptyList ();
69+ entityInitializerByEntityReference = Collections .<EntityReference ,EntityReferenceInitializer >emptyMap ();
70+ }
71+ this .arrayReferenceInitializers = CollectionHelper .isNotEmpty ( readerCollector .getArrayReferenceInitializers () )
5472 ? new ArrayList <CollectionReferenceInitializer >( readerCollector .getArrayReferenceInitializers () )
5573 : Collections .<CollectionReferenceInitializer >emptyList ();
56- this .collectionReferenceInitializers = readerCollector .getNonArrayCollectionReferenceInitializers () != null
74+ this .collectionReferenceInitializers =
75+ CollectionHelper .isNotEmpty ( readerCollector .getNonArrayCollectionReferenceInitializers () )
5776 ? new ArrayList <CollectionReferenceInitializer >( readerCollector .getNonArrayCollectionReferenceInitializers () )
5877 : Collections .<CollectionReferenceInitializer >emptyList ();
5978 }
@@ -71,17 +90,11 @@ public Object readRow(ResultSet resultSet, ResultSetProcessingContextImpl contex
7190 for ( EntityReferenceInitializer entityReferenceInitializer : entityReferenceInitializers ) {
7291 entityReferenceInitializer .hydrateIdentifier ( resultSet , context );
7392 }
74- final Map <EntityReference ,EntityReferenceInitializer > initializerByEntityReference =
75- new HashMap <EntityReference , EntityReferenceInitializer >( entityReferenceInitializers .size () );
76- for ( EntityReferenceInitializer entityReferenceInitializerFromMap : entityReferenceInitializers ) {
77- initializerByEntityReference .put ( entityReferenceInitializerFromMap .getEntityReference (), entityReferenceInitializerFromMap );
78- }
7993 for ( EntityReferenceInitializer entityReferenceInitializer : entityReferenceInitializers ) {
8094 resolveEntityKey (
8195 resultSet ,
8296 context ,
83- entityReferenceInitializer ,
84- initializerByEntityReference
97+ entityReferenceInitializer
8598 );
8699 }
87100
@@ -120,45 +133,43 @@ public Object readRow(ResultSet resultSet, ResultSetProcessingContextImpl contex
120133 private void resolveEntityKey (
121134 ResultSet resultSet ,
122135 ResultSetProcessingContextImpl context ,
123- EntityReferenceInitializer entityReferenceInitializer ,
124- Map <EntityReference ,EntityReferenceInitializer > initializerByEntityReference ) throws SQLException {
136+ EntityReferenceInitializer entityReferenceInitializer ) throws SQLException {
125137 final EntityReference entityReference = entityReferenceInitializer .getEntityReference ();
126138 final EntityIdentifierDescription identifierDescription = entityReference .getIdentifierDescription ();
127139
128140 if ( identifierDescription .hasFetches () || identifierDescription .hasBidirectionalEntityReferences () ) {
129- resolveEntityKey ( resultSet , context , (FetchSource ) identifierDescription , initializerByEntityReference );
141+ resolveEntityKey ( resultSet , context , (FetchSource ) identifierDescription );
130142 }
131143 entityReferenceInitializer .resolveEntityKey ( resultSet , context );
132144 }
133145
134146 private void resolveEntityKey (
135147 ResultSet resultSet ,
136148 ResultSetProcessingContextImpl context ,
137- FetchSource fetchSource ,
138- Map <EntityReference ,EntityReferenceInitializer > initializerByEntityReference ) throws SQLException {
149+ FetchSource fetchSource ) throws SQLException {
139150 // Resolve any bidirectional entity references first.
140151 for ( BidirectionalEntityReference bidirectionalEntityReference : fetchSource .getBidirectionalEntityReferences () ) {
141- final EntityReferenceInitializer targetEntityReferenceInitializer = initializerByEntityReference .get (
152+ final EntityReferenceInitializer targetEntityReferenceInitializer = entityInitializerByEntityReference .get (
142153 bidirectionalEntityReference .getTargetEntityReference ()
143154 );
144155 resolveEntityKey (
145156 resultSet ,
146157 context ,
147- targetEntityReferenceInitializer ,
148- initializerByEntityReference
158+ targetEntityReferenceInitializer
149159 );
150160 targetEntityReferenceInitializer .hydrateEntityState ( resultSet , context );
151161 }
152162 for ( Fetch fetch : fetchSource .getFetches () ) {
153163 if ( EntityFetch .class .isInstance ( fetch ) ) {
154164 final EntityFetch entityFetch = (EntityFetch ) fetch ;
155- final EntityReferenceInitializer entityReferenceInitializer = initializerByEntityReference .get ( entityFetch );
165+ final EntityReferenceInitializer entityReferenceInitializer = entityInitializerByEntityReference .get (
166+ entityFetch
167+ );
156168 if ( entityReferenceInitializer != null ) {
157169 resolveEntityKey (
158170 resultSet ,
159171 context ,
160- entityReferenceInitializer ,
161- initializerByEntityReference
172+ entityReferenceInitializer
162173 );
163174 entityReferenceInitializer .hydrateEntityState ( resultSet , context );
164175 }
@@ -167,8 +178,8 @@ else if ( CompositeFetch.class.isInstance( fetch ) ) {
167178 resolveEntityKey (
168179 resultSet ,
169180 context ,
170- (CompositeFetch ) fetch ,
171- initializerByEntityReference );
181+ (CompositeFetch ) fetch
182+ );
172183 }
173184 }
174185 }
0 commit comments