@@ -46,14 +46,33 @@ public abstract class AbstractRowReader implements RowReader {
46
46
private final List <CollectionReferenceInitializer > arrayReferenceInitializers ;
47
47
private final List <CollectionReferenceInitializer > collectionReferenceInitializers ;
48
48
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
+
49
53
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 () )
54
72
? new ArrayList <CollectionReferenceInitializer >( readerCollector .getArrayReferenceInitializers () )
55
73
: Collections .<CollectionReferenceInitializer >emptyList ();
56
- this .collectionReferenceInitializers = readerCollector .getNonArrayCollectionReferenceInitializers () != null
74
+ this .collectionReferenceInitializers =
75
+ CollectionHelper .isNotEmpty ( readerCollector .getNonArrayCollectionReferenceInitializers () )
57
76
? new ArrayList <CollectionReferenceInitializer >( readerCollector .getNonArrayCollectionReferenceInitializers () )
58
77
: Collections .<CollectionReferenceInitializer >emptyList ();
59
78
}
@@ -71,17 +90,11 @@ public Object readRow(ResultSet resultSet, ResultSetProcessingContextImpl contex
71
90
for ( EntityReferenceInitializer entityReferenceInitializer : entityReferenceInitializers ) {
72
91
entityReferenceInitializer .hydrateIdentifier ( resultSet , context );
73
92
}
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
- }
79
93
for ( EntityReferenceInitializer entityReferenceInitializer : entityReferenceInitializers ) {
80
94
resolveEntityKey (
81
95
resultSet ,
82
96
context ,
83
- entityReferenceInitializer ,
84
- initializerByEntityReference
97
+ entityReferenceInitializer
85
98
);
86
99
}
87
100
@@ -120,45 +133,43 @@ public Object readRow(ResultSet resultSet, ResultSetProcessingContextImpl contex
120
133
private void resolveEntityKey (
121
134
ResultSet resultSet ,
122
135
ResultSetProcessingContextImpl context ,
123
- EntityReferenceInitializer entityReferenceInitializer ,
124
- Map <EntityReference ,EntityReferenceInitializer > initializerByEntityReference ) throws SQLException {
136
+ EntityReferenceInitializer entityReferenceInitializer ) throws SQLException {
125
137
final EntityReference entityReference = entityReferenceInitializer .getEntityReference ();
126
138
final EntityIdentifierDescription identifierDescription = entityReference .getIdentifierDescription ();
127
139
128
140
if ( identifierDescription .hasFetches () || identifierDescription .hasBidirectionalEntityReferences () ) {
129
- resolveEntityKey ( resultSet , context , (FetchSource ) identifierDescription , initializerByEntityReference );
141
+ resolveEntityKey ( resultSet , context , (FetchSource ) identifierDescription );
130
142
}
131
143
entityReferenceInitializer .resolveEntityKey ( resultSet , context );
132
144
}
133
145
134
146
private void resolveEntityKey (
135
147
ResultSet resultSet ,
136
148
ResultSetProcessingContextImpl context ,
137
- FetchSource fetchSource ,
138
- Map <EntityReference ,EntityReferenceInitializer > initializerByEntityReference ) throws SQLException {
149
+ FetchSource fetchSource ) throws SQLException {
139
150
// Resolve any bidirectional entity references first.
140
151
for ( BidirectionalEntityReference bidirectionalEntityReference : fetchSource .getBidirectionalEntityReferences () ) {
141
- final EntityReferenceInitializer targetEntityReferenceInitializer = initializerByEntityReference .get (
152
+ final EntityReferenceInitializer targetEntityReferenceInitializer = entityInitializerByEntityReference .get (
142
153
bidirectionalEntityReference .getTargetEntityReference ()
143
154
);
144
155
resolveEntityKey (
145
156
resultSet ,
146
157
context ,
147
- targetEntityReferenceInitializer ,
148
- initializerByEntityReference
158
+ targetEntityReferenceInitializer
149
159
);
150
160
targetEntityReferenceInitializer .hydrateEntityState ( resultSet , context );
151
161
}
152
162
for ( Fetch fetch : fetchSource .getFetches () ) {
153
163
if ( EntityFetch .class .isInstance ( fetch ) ) {
154
164
final EntityFetch entityFetch = (EntityFetch ) fetch ;
155
- final EntityReferenceInitializer entityReferenceInitializer = initializerByEntityReference .get ( entityFetch );
165
+ final EntityReferenceInitializer entityReferenceInitializer = entityInitializerByEntityReference .get (
166
+ entityFetch
167
+ );
156
168
if ( entityReferenceInitializer != null ) {
157
169
resolveEntityKey (
158
170
resultSet ,
159
171
context ,
160
- entityReferenceInitializer ,
161
- initializerByEntityReference
172
+ entityReferenceInitializer
162
173
);
163
174
entityReferenceInitializer .hydrateEntityState ( resultSet , context );
164
175
}
@@ -167,8 +178,8 @@ else if ( CompositeFetch.class.isInstance( fetch ) ) {
167
178
resolveEntityKey (
168
179
resultSet ,
169
180
context ,
170
- (CompositeFetch ) fetch ,
171
- initializerByEntityReference );
181
+ (CompositeFetch ) fetch
182
+ );
172
183
}
173
184
}
174
185
}
0 commit comments