diff --git a/src/main/java/org/springframework/data/jpa/provider/HibernateUtils.java b/src/main/java/org/springframework/data/jpa/provider/HibernateUtils.java index 84ce421b7..39f8e0258 100644 --- a/src/main/java/org/springframework/data/jpa/provider/HibernateUtils.java +++ b/src/main/java/org/springframework/data/jpa/provider/HibernateUtils.java @@ -37,21 +37,35 @@ public abstract class HibernateUtils { "org.hibernate.ejb.HibernateQuery"); private static final Method GET_HIBERNATE_QUERY; + private static final Class HIBERNATE_QUERY_INTERFACE; + private static final Method QUERY_STRING_METHOD; + private HibernateUtils() {} static { Class type = null; Method method = null; + ClassLoader classLoader = HibernateUtils.class.getClassLoader(); for (String typeName : TYPES) { try { - type = ClassUtils.forName(typeName, HibernateUtils.class.getClassLoader()); + type = ClassUtils.forName(typeName, classLoader); method = type.getMethod("getHibernateQuery"); } catch (Exception o_O) {} } GET_HIBERNATE_QUERY = method; + + Class queryInterface = null; + + try { + queryInterface = ClassUtils.forName("org.hibernate.query.Query", classLoader); + } catch (Exception o_O) {} + + HIBERNATE_QUERY_INTERFACE = queryInterface; + QUERY_STRING_METHOD = HIBERNATE_QUERY_INTERFACE == null ? null + : ReflectionUtils.findMethod(HIBERNATE_QUERY_INTERFACE, "getQueryString"); } /** @@ -61,6 +75,11 @@ public abstract class HibernateUtils { * @return */ public static String getHibernateQuery(Object query) { + + if (HIBERNATE_QUERY_INTERFACE != null && HIBERNATE_QUERY_INTERFACE.isInstance(query)) { + return String.class.cast(ReflectionUtils.invokeMethod(QUERY_STRING_METHOD, query)); + } + return ((Query) ReflectionUtils.invokeMethod(GET_HIBERNATE_QUERY, query)).getQueryString(); } } diff --git a/src/main/java/org/springframework/data/jpa/provider/PersistenceProvider.java b/src/main/java/org/springframework/data/jpa/provider/PersistenceProvider.java index ac181bbf4..01517f0fc 100644 --- a/src/main/java/org/springframework/data/jpa/provider/PersistenceProvider.java +++ b/src/main/java/org/springframework/data/jpa/provider/PersistenceProvider.java @@ -54,7 +54,7 @@ import org.springframework.util.ReflectionUtils; * @author Oliver Gierke * @author Thomas Darimont */ -public enum PersistenceProvider implements QueryExtractor,ProxyIdAccessor { +public enum PersistenceProvider implements QueryExtractor, ProxyIdAccessor { /** * Hibernate persistence provider. @@ -65,8 +65,9 @@ public enum PersistenceProvider implements QueryExtractor,ProxyIdAccessor { * @see DATAJPA-444 */ HIBERNATE(// - Arrays.asList(HIBERNATE43_ENTITY_MANAGER_INTERFACE, HIBERNATE_ENTITY_MANAGER_INTERFACE), // - Arrays.asList(HIBERNATE43_JPA_METAMODEL_TYPE, HIBERNATE_JPA_METAMODEL_TYPE)) { + Arrays.asList(HIBERNATE52_ENTITY_MANAGER_INTERFACE, HIBERNATE43_ENTITY_MANAGER_INTERFACE, + HIBERNATE_ENTITY_MANAGER_INTERFACE), // + Arrays.asList(HIBERNATE52_JPA_METAMODEL_TYPE, HIBERNATE43_JPA_METAMODEL_TYPE, HIBERNATE_JPA_METAMODEL_TYPE)) { public String extractQueryString(Query query) { return HibernateUtils.getHibernateQuery(query); @@ -124,8 +125,7 @@ public enum PersistenceProvider implements QueryExtractor,ProxyIdAccessor { /** * EclipseLink persistence provider. */ - ECLIPSELINK(Collections.singleton(ECLIPSELINK_ENTITY_MANAGER_INTERFACE), - Collections.singleton(ECLIPSELINK_JPA_METAMODEL_TYPE)) { + ECLIPSELINK(Collections.singleton(ECLIPSELINK_ENTITY_MANAGER_INTERFACE), Collections.singleton(ECLIPSELINK_JPA_METAMODEL_TYPE)) { public String extractQueryString(Query query) { return ((JpaQuery) query).getDatabaseQuery().getJPQLString(); @@ -263,9 +263,11 @@ public enum PersistenceProvider implements QueryExtractor,ProxyIdAccessor { String ECLIPSELINK_ENTITY_MANAGER_INTERFACE = "org.eclipse.persistence.jpa.JpaEntityManager"; String HIBERNATE_ENTITY_MANAGER_INTERFACE = "org.hibernate.ejb.HibernateEntityManager"; String HIBERNATE43_ENTITY_MANAGER_INTERFACE = "org.hibernate.jpa.HibernateEntityManager"; + String HIBERNATE52_ENTITY_MANAGER_INTERFACE = "org.hibernate.Session"; String HIBERNATE_JPA_METAMODEL_TYPE = "org.hibernate.ejb.metamodel.MetamodelImpl"; String HIBERNATE43_JPA_METAMODEL_TYPE = "org.hibernate.jpa.internal.metamodel.MetamodelImpl"; + String HIBERNATE52_JPA_METAMODEL_TYPE = "org.hibernate.metamodel.internal.MetamodelImpl"; String ECLIPSELINK_JPA_METAMODEL_TYPE = "org.eclipse.persistence.internal.jpa.metamodel.MetamodelImpl"; String OPENJPA_JPA_METAMODEL_TYPE = "org.apache.openjpa.persistence.meta.MetamodelImpl"; } diff --git a/src/test/java/org/springframework/data/jpa/provider/PersistenceProviderUnitTests.java b/src/test/java/org/springframework/data/jpa/provider/PersistenceProviderUnitTests.java index fa2327560..9f6c84d68 100644 --- a/src/test/java/org/springframework/data/jpa/provider/PersistenceProviderUnitTests.java +++ b/src/test/java/org/springframework/data/jpa/provider/PersistenceProviderUnitTests.java @@ -25,6 +25,8 @@ import java.util.List; import javax.persistence.EntityManager; +import org.hibernate.Version; +import org.junit.Assume; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; @@ -102,6 +104,21 @@ public class PersistenceProviderUnitTests { assertThat(fromEntityManager(em), is(GENERIC_JPA)); } + /** + * @see DATAJPA-1019 + */ + @Test + public void detectsHibernatePersistenceProviderForHibernateVersion52() throws Exception { + + Assume.assumeThat(Version.getVersionString(), startsWith("5.2")); + + shadowingClassLoader.excludePackage("org.hibernate"); + + EntityManager em = mockProviderSpecificEntityManagerInterface(HIBERNATE52_ENTITY_MANAGER_INTERFACE); + + assertThat(fromEntityManager(em), is(HIBERNATE)); + } + private EntityManager mockProviderSpecificEntityManagerInterface(String interfaceName) throws ClassNotFoundException { Class providerSpecificEntityManagerInterface = InterfaceGenerator.generate(interfaceName, shadowingClassLoader, diff --git a/src/test/java/org/springframework/data/jpa/repository/cdi/EntityManagerFactoryProducer.java b/src/test/java/org/springframework/data/jpa/repository/cdi/EntityManagerFactoryProducer.java index 73e91fa53..d7cfd7811 100644 --- a/src/test/java/org/springframework/data/jpa/repository/cdi/EntityManagerFactoryProducer.java +++ b/src/test/java/org/springframework/data/jpa/repository/cdi/EntityManagerFactoryProducer.java @@ -21,12 +21,16 @@ import javax.enterprise.inject.Produces; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; +import org.hibernate.Version; + class EntityManagerFactoryProducer { @Produces @ApplicationScoped public EntityManagerFactory createEntityManagerFactory() { - return Persistence.createEntityManagerFactory("cdi"); + + String hibernateVersion = Version.getVersionString(); + return Persistence.createEntityManagerFactory(hibernateVersion.startsWith("5.2") ? "cdi-52" : "cdi"); } public void close(@Disposes EntityManagerFactory entityManagerFactory) { diff --git a/src/test/java/org/springframework/data/jpa/repository/support/JpaMetamodelEntityInformationIntegrationTests.java b/src/test/java/org/springframework/data/jpa/repository/support/JpaMetamodelEntityInformationIntegrationTests.java index c83fdbaff..a4ba76ad0 100644 --- a/src/test/java/org/springframework/data/jpa/repository/support/JpaMetamodelEntityInformationIntegrationTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/support/JpaMetamodelEntityInformationIntegrationTests.java @@ -35,6 +35,7 @@ import javax.persistence.Persistence; import javax.persistence.PersistenceContext; import javax.persistence.metamodel.Metamodel; +import org.hibernate.Version; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -333,7 +334,7 @@ public class JpaMetamodelEntityInformationIntegrationTests { } protected String getMetadadataPersitenceUnitName() { - return "metadata"; + return Version.getVersionString().startsWith("5.2") ? "metadata-52" : "metadata"; } @SuppressWarnings("serial") diff --git a/src/test/resources/META-INF/persistence.xml b/src/test/resources/META-INF/persistence.xml index ea0e22431..5c24cbe85 100644 --- a/src/test/resources/META-INF/persistence.xml +++ b/src/test/resources/META-INF/persistence.xml @@ -71,7 +71,26 @@ - + + + org.hibernate.jpa.HibernatePersistenceProvider + org.springframework.data.jpa.domain.sample.MailMessage + org.springframework.data.jpa.domain.sample.MailSender + org.springframework.data.jpa.domain.sample.MailUser + org.springframework.data.jpa.domain.sample.User + org.springframework.data.jpa.repository.cdi.Person + org.springframework.data.jpa.domain.sample.Dummy + true + + + + + + + + + + org.springframework.data.jpa.domain.sample.User @@ -99,6 +118,19 @@ + + org.hibernate.jpa.HibernatePersistenceProvider + org.springframework.data.jpa.domain.sample.CustomAbstractPersistable + org.springframework.data.jpa.domain.sample.MailMessage + org.springframework.data.jpa.domain.sample.MailSender + org.springframework.data.jpa.domain.sample.MailUser + org.springframework.data.jpa.domain.sample.User + org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformationIntegrationTests$Sample + true + + + + org.eclipse.persistence.jpa.PersistenceProvider org.springframework.data.jpa.domain.sample.CustomAbstractPersistable