diff --git a/src/main/java/javax/persistence/spi/PersistenceProviderResolverHolder.java b/src/main/java/javax/persistence/spi/PersistenceProviderResolverHolder.java index 4a2ca6f..02483fb 100644 --- a/src/main/java/javax/persistence/spi/PersistenceProviderResolverHolder.java +++ b/src/main/java/javax/persistence/spi/PersistenceProviderResolverHolder.java @@ -18,7 +18,7 @@ import java.net.URL; import java.util.ArrayList; import java.util.Enumeration; -import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import java.util.WeakHashMap; @@ -126,7 +126,7 @@ private void loadResolverClasses(ClassLoader cl) { synchronized ( resolverClasses ) { try { Enumeration resources = cl.getResources( "META-INF/services/" + PersistenceProvider.class.getName() ); - Set names = new HashSet(); + Set names = new LinkedHashSet(); while ( resources.hasMoreElements() ) { URL url = resources.nextElement(); InputStream is = url.openStream(); @@ -137,21 +137,20 @@ private void loadResolverClasses(ClassLoader cl) { is.close(); } } + List>> nonHibernateClasses = new ArrayList>>(); for ( String s : names ) { @SuppressWarnings( "unchecked" ) Class providerClass = (Class) cl.loadClass( s ); WeakReference> reference = new WeakReference>(providerClass); //keep Hibernate atop - if ( s.endsWith( "HibernatePersistence" ) && resolverClasses.size() > 0 ) { - WeakReference> movedReference = resolverClasses.get( 0 ); - resolverClasses.add( 0, reference ); - resolverClasses.add( movedReference ); - } - else { + if ( s.startsWith("org.hibernate") ) { resolverClasses.add( reference ); + } else { + nonHibernateClasses.add( reference ); } } + resolverClasses.addAll( nonHibernateClasses ); } catch ( IOException e ) { throw new PersistenceException( e ); @@ -201,7 +200,7 @@ public synchronized void clearCachedProviders() { private static final Pattern nonCommentPattern = Pattern.compile( "^([^#]+)" ); private static Set providerNamesFromReader(BufferedReader reader) throws IOException { - Set names = new HashSet(); + Set names = new LinkedHashSet(); String line; while ( ( line = reader.readLine() ) != null ) { line = line.trim();