Skip to content

Commit 0e68be8

Browse files
committed
DATACMNS-1019 - Assert Hibernate 5.2 compatibility.
Improved our detection of Hibernate 5.2 in the query lookup for String based queries, general PersistenceProvider detection (due to changed interface hierarchies in Hibernate 5.2). Tweaked the setup for some integration tests to point to Hibernate 5.2 specific persistence units using the new location for the persistence provider implementation class.
1 parent 3ed3ecf commit 0e68be8

File tree

6 files changed

+84
-9
lines changed

6 files changed

+84
-9
lines changed

src/main/java/org/springframework/data/jpa/provider/HibernateUtils.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,21 +37,35 @@ public abstract class HibernateUtils {
3737
"org.hibernate.ejb.HibernateQuery");
3838
private static final Method GET_HIBERNATE_QUERY;
3939

40+
private static final Class<?> HIBERNATE_QUERY_INTERFACE;
41+
private static final Method QUERY_STRING_METHOD;
42+
4043
private HibernateUtils() {}
4144

4245
static {
4346

4447
Class<?> type = null;
4548
Method method = null;
49+
ClassLoader classLoader = HibernateUtils.class.getClassLoader();
4650

4751
for (String typeName : TYPES) {
4852
try {
49-
type = ClassUtils.forName(typeName, HibernateUtils.class.getClassLoader());
53+
type = ClassUtils.forName(typeName, classLoader);
5054
method = type.getMethod("getHibernateQuery");
5155
} catch (Exception o_O) {}
5256
}
5357

5458
GET_HIBERNATE_QUERY = method;
59+
60+
Class<?> queryInterface = null;
61+
62+
try {
63+
queryInterface = ClassUtils.forName("org.hibernate.query.Query", classLoader);
64+
} catch (Exception o_O) {}
65+
66+
HIBERNATE_QUERY_INTERFACE = queryInterface;
67+
QUERY_STRING_METHOD = HIBERNATE_QUERY_INTERFACE == null ? null
68+
: ReflectionUtils.findMethod(HIBERNATE_QUERY_INTERFACE, "getQueryString");
5569
}
5670

5771
/**
@@ -61,6 +75,11 @@ private HibernateUtils() {}
6175
* @return
6276
*/
6377
public static String getHibernateQuery(Object query) {
78+
79+
if (HIBERNATE_QUERY_INTERFACE != null && HIBERNATE_QUERY_INTERFACE.isInstance(query)) {
80+
return String.class.cast(ReflectionUtils.invokeMethod(QUERY_STRING_METHOD, query));
81+
}
82+
6483
return ((Query) ReflectionUtils.invokeMethod(GET_HIBERNATE_QUERY, query)).getQueryString();
6584
}
6685
}

src/main/java/org/springframework/data/jpa/provider/PersistenceProvider.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454
* @author Oliver Gierke
5555
* @author Thomas Darimont
5656
*/
57-
public enum PersistenceProvider implements QueryExtractor,ProxyIdAccessor {
57+
public enum PersistenceProvider implements QueryExtractor, ProxyIdAccessor {
5858

5959
/**
6060
* Hibernate persistence provider.
@@ -65,8 +65,9 @@ public enum PersistenceProvider implements QueryExtractor,ProxyIdAccessor {
6565
* @see DATAJPA-444
6666
*/
6767
HIBERNATE(//
68-
Arrays.asList(HIBERNATE43_ENTITY_MANAGER_INTERFACE, HIBERNATE_ENTITY_MANAGER_INTERFACE), //
69-
Arrays.asList(HIBERNATE43_JPA_METAMODEL_TYPE, HIBERNATE_JPA_METAMODEL_TYPE)) {
68+
Arrays.asList(HIBERNATE52_ENTITY_MANAGER_INTERFACE, HIBERNATE43_ENTITY_MANAGER_INTERFACE,
69+
HIBERNATE_ENTITY_MANAGER_INTERFACE), //
70+
Arrays.asList(HIBERNATE52_JPA_METAMODEL_TYPE, HIBERNATE43_JPA_METAMODEL_TYPE, HIBERNATE_JPA_METAMODEL_TYPE)) {
7071

7172
public String extractQueryString(Query query) {
7273
return HibernateUtils.getHibernateQuery(query);
@@ -124,8 +125,7 @@ public CloseableIterator<Object> executeQueryWithResultStream(Query jpaQuery) {
124125
/**
125126
* EclipseLink persistence provider.
126127
*/
127-
ECLIPSELINK(Collections.singleton(ECLIPSELINK_ENTITY_MANAGER_INTERFACE),
128-
Collections.singleton(ECLIPSELINK_JPA_METAMODEL_TYPE)) {
128+
ECLIPSELINK(Collections.singleton(ECLIPSELINK_ENTITY_MANAGER_INTERFACE), Collections.singleton(ECLIPSELINK_JPA_METAMODEL_TYPE)) {
129129

130130
public String extractQueryString(Query query) {
131131
return ((JpaQuery<?>) query).getDatabaseQuery().getJPQLString();
@@ -263,9 +263,11 @@ static interface Constants {
263263
String ECLIPSELINK_ENTITY_MANAGER_INTERFACE = "org.eclipse.persistence.jpa.JpaEntityManager";
264264
String HIBERNATE_ENTITY_MANAGER_INTERFACE = "org.hibernate.ejb.HibernateEntityManager";
265265
String HIBERNATE43_ENTITY_MANAGER_INTERFACE = "org.hibernate.jpa.HibernateEntityManager";
266+
String HIBERNATE52_ENTITY_MANAGER_INTERFACE = "org.hibernate.Session";
266267

267268
String HIBERNATE_JPA_METAMODEL_TYPE = "org.hibernate.ejb.metamodel.MetamodelImpl";
268269
String HIBERNATE43_JPA_METAMODEL_TYPE = "org.hibernate.jpa.internal.metamodel.MetamodelImpl";
270+
String HIBERNATE52_JPA_METAMODEL_TYPE = "org.hibernate.metamodel.internal.MetamodelImpl";
269271
String ECLIPSELINK_JPA_METAMODEL_TYPE = "org.eclipse.persistence.internal.jpa.metamodel.MetamodelImpl";
270272
String OPENJPA_JPA_METAMODEL_TYPE = "org.apache.openjpa.persistence.meta.MetamodelImpl";
271273
}

src/test/java/org/springframework/data/jpa/provider/PersistenceProviderUnitTests.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525

2626
import javax.persistence.EntityManager;
2727

28+
import org.hibernate.Version;
29+
import org.junit.Assume;
2830
import org.junit.Before;
2931
import org.junit.Test;
3032
import org.mockito.Mockito;
@@ -102,6 +104,21 @@ public void fallbackToGenericJpaForUnknownPersistenceProvider() throws Exception
102104
assertThat(fromEntityManager(em), is(GENERIC_JPA));
103105
}
104106

107+
/**
108+
* @see DATAJPA-1019
109+
*/
110+
@Test
111+
public void detectsHibernatePersistenceProviderForHibernateVersion52() throws Exception {
112+
113+
Assume.assumeThat(Version.getVersionString(), startsWith("5.2"));
114+
115+
shadowingClassLoader.excludePackage("org.hibernate");
116+
117+
EntityManager em = mockProviderSpecificEntityManagerInterface(HIBERNATE52_ENTITY_MANAGER_INTERFACE);
118+
119+
assertThat(fromEntityManager(em), is(HIBERNATE));
120+
}
121+
105122
private EntityManager mockProviderSpecificEntityManagerInterface(String interfaceName) throws ClassNotFoundException {
106123

107124
Class<?> providerSpecificEntityManagerInterface = InterfaceGenerator.generate(interfaceName, shadowingClassLoader,

src/test/java/org/springframework/data/jpa/repository/cdi/EntityManagerFactoryProducer.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,16 @@
2121
import javax.persistence.EntityManagerFactory;
2222
import javax.persistence.Persistence;
2323

24+
import org.hibernate.Version;
25+
2426
class EntityManagerFactoryProducer {
2527

2628
@Produces
2729
@ApplicationScoped
2830
public EntityManagerFactory createEntityManagerFactory() {
29-
return Persistence.createEntityManagerFactory("cdi");
31+
32+
String hibernateVersion = Version.getVersionString();
33+
return Persistence.createEntityManagerFactory(hibernateVersion.startsWith("5.2") ? "cdi-52" : "cdi");
3034
}
3135

3236
public void close(@Disposes EntityManagerFactory entityManagerFactory) {

src/test/java/org/springframework/data/jpa/repository/support/JpaMetamodelEntityInformationIntegrationTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import javax.persistence.PersistenceContext;
3636
import javax.persistence.metamodel.Metamodel;
3737

38+
import org.hibernate.Version;
3839
import org.junit.Ignore;
3940
import org.junit.Test;
4041
import org.junit.runner.RunWith;
@@ -333,7 +334,7 @@ public void detectsVersionPropertyOnMappedSuperClass() {
333334
}
334335

335336
protected String getMetadadataPersitenceUnitName() {
336-
return "metadata";
337+
return Version.getVersionString().startsWith("5.2") ? "metadata-52" : "metadata";
337338
}
338339

339340
@SuppressWarnings("serial")

src/test/resources/META-INF/persistence.xml

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,26 @@
7171
<property name="hibernate.hbm2ddl.auto" value="update" />
7272
</properties>
7373
</persistence-unit>
74-
74+
75+
<persistence-unit name="cdi-52">
76+
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
77+
<class>org.springframework.data.jpa.domain.sample.MailMessage</class>
78+
<class>org.springframework.data.jpa.domain.sample.MailSender</class>
79+
<class>org.springframework.data.jpa.domain.sample.MailUser</class>
80+
<class>org.springframework.data.jpa.domain.sample.User</class>
81+
<class>org.springframework.data.jpa.repository.cdi.Person</class>
82+
<class>org.springframework.data.jpa.domain.sample.Dummy</class>
83+
<exclude-unlisted-classes>true</exclude-unlisted-classes>
84+
<properties>
85+
<property name="hibernate.connection.username" value="sa" />
86+
<property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver" />
87+
<property name="hibernate.connection.password" value="" />
88+
<property name="hibernate.connection.url" value="jdbc:hsqldb:mem:cdi" />
89+
<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" />
90+
<property name="hibernate.hbm2ddl.auto" value="update" />
91+
</properties>
92+
</persistence-unit>
93+
7594
<!-- DATAJPA-476 -->
7695
<persistence-unit name="merchant">
7796
<class>org.springframework.data.jpa.domain.sample.User</class>
@@ -99,6 +118,19 @@
99118
<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" />
100119
</properties>
101120
</persistence-unit>
121+
<persistence-unit name="metadata-52">
122+
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
123+
<class>org.springframework.data.jpa.domain.sample.CustomAbstractPersistable</class>
124+
<class>org.springframework.data.jpa.domain.sample.MailMessage</class>
125+
<class>org.springframework.data.jpa.domain.sample.MailSender</class>
126+
<class>org.springframework.data.jpa.domain.sample.MailUser</class>
127+
<class>org.springframework.data.jpa.domain.sample.User</class>
128+
<class>org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformationIntegrationTests$Sample</class>
129+
<exclude-unlisted-classes>true</exclude-unlisted-classes>
130+
<properties>
131+
<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" />
132+
</properties>
133+
</persistence-unit>
102134
<persistence-unit name="metadata_el">
103135
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
104136
<class>org.springframework.data.jpa.domain.sample.CustomAbstractPersistable</class>

0 commit comments

Comments
 (0)