Skip to content

Commit 050460f

Browse files
committed
Check factory bean for EntityManager datasource
Update `DataSourceInitializedPublisher` to fallback to the `LocalContainerEntityManagerFactoryBean` if the `javax.persistence.nonJtaDataSource` property is not defined. As of Hibernate 4.3 the property is no longer set if the `EntityManager` is created from a `PersistenceUnitInfo` instance rather than actual properties. Although this is being addressed in Hibernate issue HHH-13432, it's not strictly a requirement of the JPA spec that the property is set. Fixes gh-17061
1 parent 9c09c7d commit 050460f

File tree

1 file changed

+22
-16
lines changed

1 file changed

+22
-16
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/DataSourceInitializedPublisher.java

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,7 @@ public Object postProcessBeforeInitialization(Object bean, String beanName) thro
6565
if (bean instanceof LocalContainerEntityManagerFactoryBean) {
6666
LocalContainerEntityManagerFactoryBean factory = (LocalContainerEntityManagerFactoryBean) bean;
6767
if (factory.getBootstrapExecutor() != null && factory.getJpaVendorAdapter() != null) {
68-
this.schemaCreatedPublisher = new DataSourceSchemaCreatedPublisher(factory.getBootstrapExecutor(),
69-
factory.getJpaVendorAdapter());
68+
this.schemaCreatedPublisher = new DataSourceSchemaCreatedPublisher(factory);
7069
factory.setJpaVendorAdapter(this.schemaCreatedPublisher);
7170
}
7271
}
@@ -86,21 +85,27 @@ public Object postProcessAfterInitialization(Object bean, String beanName) throw
8685
this.hibernateProperties = (HibernateProperties) bean;
8786
}
8887
if (bean instanceof LocalContainerEntityManagerFactoryBean && this.schemaCreatedPublisher == null) {
89-
LocalContainerEntityManagerFactoryBean factory = (LocalContainerEntityManagerFactoryBean) bean;
90-
publishEventIfRequired(factory.getNativeEntityManagerFactory());
88+
LocalContainerEntityManagerFactoryBean factoryBean = (LocalContainerEntityManagerFactoryBean) bean;
89+
EntityManagerFactory entityManagerFactory = factoryBean.getNativeEntityManagerFactory();
90+
publishEventIfRequired(factoryBean, entityManagerFactory);
9191
}
9292
return bean;
9393
}
9494

95-
private void publishEventIfRequired(EntityManagerFactory entityManagerFactory) {
96-
DataSource dataSource = findDataSource(entityManagerFactory);
95+
private void publishEventIfRequired(LocalContainerEntityManagerFactoryBean factoryBean,
96+
EntityManagerFactory entityManagerFactory) {
97+
DataSource dataSource = findDataSource(factoryBean, entityManagerFactory);
9798
if (dataSource != null && isInitializingDatabase(dataSource)) {
9899
this.applicationContext.publishEvent(new DataSourceSchemaCreatedEvent(dataSource));
99100
}
100101
}
101102

102-
private DataSource findDataSource(EntityManagerFactory entityManagerFactory) {
103+
private DataSource findDataSource(LocalContainerEntityManagerFactoryBean factoryBean,
104+
EntityManagerFactory entityManagerFactory) {
103105
Object dataSource = entityManagerFactory.getProperties().get("javax.persistence.nonJtaDataSource");
106+
if (dataSource == null) {
107+
dataSource = factoryBean.getPersistenceUnitInfo().getNonJtaDataSource();
108+
}
104109
return (dataSource instanceof DataSource) ? (DataSource) dataSource : this.dataSource;
105110
}
106111

@@ -145,14 +150,13 @@ public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
145150

146151
final class DataSourceSchemaCreatedPublisher implements JpaVendorAdapter {
147152

148-
private final AsyncTaskExecutor bootstrapExecutor;
153+
private final LocalContainerEntityManagerFactoryBean factoryBean;
149154

150155
private final JpaVendorAdapter delegate;
151156

152-
private DataSourceSchemaCreatedPublisher(AsyncTaskExecutor bootstrapExecutor,
153-
JpaVendorAdapter jpaVendorAdapter) {
154-
this.bootstrapExecutor = bootstrapExecutor;
155-
this.delegate = jpaVendorAdapter;
157+
private DataSourceSchemaCreatedPublisher(LocalContainerEntityManagerFactoryBean factoryBean) {
158+
this.factoryBean = factoryBean;
159+
this.delegate = factoryBean.getJpaVendorAdapter();
156160
}
157161

158162
@Override
@@ -191,10 +195,12 @@ public Class<? extends EntityManager> getEntityManagerInterface() {
191195
}
192196

193197
@Override
194-
public void postProcessEntityManagerFactory(EntityManagerFactory emf) {
195-
this.delegate.postProcessEntityManagerFactory(emf);
196-
if (this.bootstrapExecutor != null) {
197-
this.bootstrapExecutor.execute(() -> DataSourceInitializedPublisher.this.publishEventIfRequired(emf));
198+
public void postProcessEntityManagerFactory(EntityManagerFactory entityManagerFactory) {
199+
this.delegate.postProcessEntityManagerFactory(entityManagerFactory);
200+
AsyncTaskExecutor bootstrapExecutor = this.factoryBean.getBootstrapExecutor();
201+
if (bootstrapExecutor != null) {
202+
bootstrapExecutor.execute(() -> DataSourceInitializedPublisher.this
203+
.publishEventIfRequired(this.factoryBean, entityManagerFactory));
198204
}
199205
}
200206

0 commit comments

Comments
 (0)