66 */
77package org .hibernate .loader .entity ;
88
9- import org .hibernate .HibernateException ;
109import org .hibernate .LockMode ;
1110import org .hibernate .LockOptions ;
1211import org .hibernate .MappingException ;
13- import org .hibernate .engine .jdbc .Size ;
1412import org .hibernate .engine .spi .LoadQueryInfluencers ;
15- import org .hibernate .engine .spi .Mapping ;
1613import org .hibernate .engine .spi .SessionFactoryImplementor ;
1714import org .hibernate .engine .spi .SharedSessionContractImplementor ;
18- import org .hibernate .internal .util .collections .ArrayHelper ;
1915import org .hibernate .persister .entity .OuterJoinLoadable ;
20- import org .hibernate .type .AbstractType ;
2116import org .hibernate .type .Type ;
2217
23- import java .sql .PreparedStatement ;
24- import java .sql .ResultSet ;
25- import java .sql .SQLException ;
26- import java .util .ArrayList ;
27- import java .util .Arrays ;
28- import java .util .List ;
29- import java .util .Map ;
30-
3118/**
3219 * Loads an entity instance using outerjoin fetching to fetch associated entities.
3320 * <br>
@@ -162,23 +149,14 @@ public EntityLoader(
162149 LoadQueryInfluencers loadQueryInfluencers ) throws MappingException {
163150 super ( persister , new NaturalIdType ( persister , valueNullness ), factory , loadQueryInfluencers );
164151
165- EntityJoinWalker walker = new EntityJoinWalker (
152+ EntityJoinWalker walker = new NaturalIdEntityJoinWalker (
166153 persister ,
167- naturalIdColumns ( valueNullness ) ,
154+ valueNullness ,
168155 batchSize ,
169156 lockOptions ,
170157 factory ,
171158 loadQueryInfluencers
172- ) {
173- @ Override
174- protected StringBuilder whereString (String alias , String [] columnNames , int batchSize ) {
175- StringBuilder sql = super .whereString (alias , columnNames , batchSize );
176- for (String nullCol : naturalIdColumns ( ArrayHelper .negate ( valueNullness ) ) ) {
177- sql .append (" and " ).append ( getAlias () ).append ('.' ).append (nullCol ).append (" is null" );
178- }
179- return sql ;
180- }
181- };
159+ );
182160 initFromWalker ( walker );
183161 compositeKeyManyToOneTargetIndices = walker .getCompositeKeyManyToOneTargetIndices ();
184162 postInstantiate ();
@@ -194,17 +172,6 @@ protected StringBuilder whereString(String alias, String[] columnNames, int batc
194172 }
195173 }
196174
197- private String [] naturalIdColumns (boolean [] valueNullness ) {
198- int i = 0 ;
199- List <String > columns = new ArrayList <>();
200- for ( int p : persister .getNaturalIdentifierProperties () ) {
201- if ( !valueNullness [i ++] ) {
202- columns .addAll ( Arrays .asList ( persister .getPropertyColumnNames (p ) ) );
203- }
204- }
205- return columns .toArray (ArrayHelper .EMPTY_STRING_ARRAY );
206- }
207-
208175 public Object loadByUniqueKey (SharedSessionContractImplementor session , Object key ) {
209176 return loadByUniqueKey ( session , key , null );
210177 }
@@ -223,117 +190,4 @@ public int[][] getCompositeKeyManyToOneTargetIndices() {
223190 return compositeKeyManyToOneTargetIndices ;
224191 }
225192
226- static class NaturalIdType extends AbstractType {
227- private OuterJoinLoadable persister ;
228- private boolean [] valueNullness ;
229-
230- NaturalIdType (OuterJoinLoadable persister , boolean [] valueNullness ) {
231- this .persister = persister ;
232- this .valueNullness = valueNullness ;
233- }
234-
235- @ Override
236- public int getColumnSpan (Mapping mapping ) throws MappingException {
237- int span = 0 ;
238- int i = 0 ;
239- for ( int p : persister .getNaturalIdentifierProperties () ) {
240- if ( !valueNullness [i ++] ) {
241- span += persister .getPropertyColumnNames (p ).length ;
242- }
243- }
244- return span ;
245- }
246-
247- @ Override
248- public int [] sqlTypes (Mapping mapping ) throws MappingException {
249- throw new UnsupportedOperationException ();
250- }
251-
252- @ Override
253- public Size [] dictatedSizes (Mapping mapping ) throws MappingException {
254- throw new UnsupportedOperationException ();
255- }
256-
257- @ Override
258- public Size [] defaultSizes (Mapping mapping ) throws MappingException {
259- throw new UnsupportedOperationException ();
260- }
261-
262- @ Override
263- public Class getReturnedClass () {
264- throw new UnsupportedOperationException ();
265- }
266-
267- @ Override
268- public boolean isDirty (Object oldState , Object currentState , boolean [] checkable , SharedSessionContractImplementor session )
269- throws HibernateException {
270- throw new UnsupportedOperationException ();
271- }
272-
273- @ Override
274- public Object nullSafeGet (ResultSet rs , String [] names , SharedSessionContractImplementor session , Object owner )
275- throws HibernateException , SQLException {
276- throw new UnsupportedOperationException ();
277- }
278-
279- @ Override
280- public Object nullSafeGet (ResultSet rs , String name , SharedSessionContractImplementor session , Object owner )
281- throws HibernateException , SQLException {
282- throw new UnsupportedOperationException ();
283- }
284-
285- @ Override
286- public void nullSafeSet (PreparedStatement st , Object value , int index , boolean [] settable , SharedSessionContractImplementor session )
287- throws HibernateException , SQLException {
288- throw new UnsupportedOperationException ();
289- }
290-
291- @ Override
292- public void nullSafeSet (PreparedStatement st , Object value , int index , SharedSessionContractImplementor session )
293- throws HibernateException , SQLException {
294- Object [] keys = (Object []) value ;
295- int i = 0 ;
296- for ( int p : persister .getNaturalIdentifierProperties () ) {
297- if ( !valueNullness [i ] ) {
298- persister .getPropertyTypes ()[p ].nullSafeSet ( st , keys [i ], index ++, session );
299- }
300- i ++;
301- }
302- }
303-
304- @ Override
305- public String toLoggableString (Object value , SessionFactoryImplementor factory ) {
306- return "natural id" ;
307- }
308-
309- @ Override
310- public String getName () {
311- throw new UnsupportedOperationException ();
312- }
313-
314- @ Override
315- public Object deepCopy (Object value , SessionFactoryImplementor factory ) {
316- throw new UnsupportedOperationException ();
317- }
318-
319- @ Override
320- public boolean isMutable () {
321- throw new UnsupportedOperationException ();
322- }
323-
324- @ Override
325- public Object resolve (Object value , SharedSessionContractImplementor session , Object owner , Boolean overridingEager ) {
326- throw new UnsupportedOperationException ();
327- }
328-
329- @ Override
330- public Object replace (Object original , Object target , SharedSessionContractImplementor session , Object owner , Map copyCache ) {
331- throw new UnsupportedOperationException ();
332- }
333-
334- @ Override
335- public boolean [] toColumnNullness (Object value , Mapping mapping ) {
336- throw new UnsupportedOperationException ();
337- }
338- }
339193}
0 commit comments