Skip to content

Commit b235ee8

Browse files
authored
fix(GH-225): Configure shared entity manager for multiple data sources example (#228)
* fix: Propagate TxType.REQUIRES_NEW per request * fix(example): configured shared entity manager proxy bean
1 parent 38bfb17 commit b235ee8

File tree

3 files changed

+36
-18
lines changed

3 files changed

+36
-18
lines changed

graphql-jpa-query-example-merge/src/main/java/com/introproventures/graphql/jpa/query/example/books/BooksSchemaConfiguration.java

+17-8
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,6 @@
77
import javax.persistence.EntityManagerFactory;
88
import javax.sql.DataSource;
99

10-
import com.introproventures.graphql.jpa.query.autoconfigure.GraphQLJpaQueryProperties;
11-
import com.introproventures.graphql.jpa.query.autoconfigure.GraphQLSchemaConfigurer;
12-
import com.introproventures.graphql.jpa.query.autoconfigure.GraphQLShemaRegistration;
13-
import com.introproventures.graphql.jpa.query.schema.impl.GraphQLJpaSchemaBuilder;
14-
import com.introproventures.graphql.jpa.query.schema.model.book.Book;
1510
import org.hibernate.cfg.AvailableSettings;
1611
import org.hibernate.dialect.H2Dialect;
1712
import org.springframework.beans.factory.annotation.Autowired;
@@ -26,6 +21,13 @@
2621
import org.springframework.jdbc.datasource.init.DataSourceInitializer;
2722
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
2823
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
24+
import org.springframework.orm.jpa.support.SharedEntityManagerBean;
25+
26+
import com.introproventures.graphql.jpa.query.autoconfigure.GraphQLJpaQueryProperties;
27+
import com.introproventures.graphql.jpa.query.autoconfigure.GraphQLSchemaConfigurer;
28+
import com.introproventures.graphql.jpa.query.autoconfigure.GraphQLShemaRegistration;
29+
import com.introproventures.graphql.jpa.query.schema.impl.GraphQLJpaSchemaBuilder;
30+
import com.introproventures.graphql.jpa.query.schema.model.book.Book;
2931

3032
@Configuration
3133
public class BooksSchemaConfiguration {
@@ -39,7 +41,6 @@ public DataSource bookDataSource() {
3941
}
4042

4143
@Bean
42-
@Qualifier("bookEntityManager")
4344
public LocalContainerEntityManagerFactoryBean bookEntityManagerFactory(
4445
EntityManagerFactoryBuilder builder) {
4546
Map<String, Object> properties = new HashMap<>();
@@ -71,6 +72,14 @@ public DataSourceInitializer booksDataSourceInitializer(@Qualifier("bookDataSour
7172
return dataSourceInitializer;
7273
}
7374

75+
76+
@Bean
77+
public SharedEntityManagerBean bookEntityManager(EntityManagerFactory bookEntityManagerFactory) {
78+
SharedEntityManagerBean bean = new SharedEntityManagerBean();
79+
bean.setEntityManagerFactory(bookEntityManagerFactory);
80+
81+
return bean;
82+
}
7483

7584
@Configuration
7685
public static class GraphQLJpaQuerySchemaConfigurer implements GraphQLSchemaConfigurer {
@@ -80,8 +89,8 @@ public static class GraphQLJpaQuerySchemaConfigurer implements GraphQLSchemaConf
8089
@Autowired
8190
private GraphQLJpaQueryProperties properties;
8291

83-
public GraphQLJpaQuerySchemaConfigurer(@Qualifier("bookEntityManager") EntityManagerFactory entityManager) {
84-
this.entityManager = entityManager.createEntityManager();
92+
public GraphQLJpaQuerySchemaConfigurer(EntityManager bookEntityManager) {
93+
this.entityManager = bookEntityManager;
8594
}
8695

8796
@Override

graphql-jpa-query-example-merge/src/main/java/com/introproventures/graphql/jpa/query/example/starwars/StarwarsSchemaConfiguration.java

+16-8
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,6 @@
77
import javax.persistence.EntityManagerFactory;
88
import javax.sql.DataSource;
99

10-
import com.introproventures.graphql.jpa.query.autoconfigure.GraphQLSchemaConfigurer;
11-
import com.introproventures.graphql.jpa.query.autoconfigure.GraphQLShemaRegistration;
12-
import com.introproventures.graphql.jpa.query.schema.impl.GraphQLJpaSchemaBuilder;
13-
import com.introproventures.graphql.jpa.query.schema.model.starwars.Droid;
1410
import org.hibernate.cfg.AvailableSettings;
1511
import org.hibernate.dialect.H2Dialect;
1612
import org.springframework.beans.factory.annotation.Qualifier;
@@ -25,6 +21,12 @@
2521
import org.springframework.jdbc.datasource.init.DataSourceInitializer;
2622
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
2723
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
24+
import org.springframework.orm.jpa.support.SharedEntityManagerBean;
25+
26+
import com.introproventures.graphql.jpa.query.autoconfigure.GraphQLSchemaConfigurer;
27+
import com.introproventures.graphql.jpa.query.autoconfigure.GraphQLShemaRegistration;
28+
import com.introproventures.graphql.jpa.query.schema.impl.GraphQLJpaSchemaBuilder;
29+
import com.introproventures.graphql.jpa.query.schema.model.starwars.Droid;
2830

2931
@Configuration
3032
public class StarwarsSchemaConfiguration {
@@ -38,7 +40,7 @@ public DataSource starWarsDataSource() {
3840
}
3941

4042
@Bean
41-
public DataSourceInitializer starWarsDataSourceInitializer(@Qualifier("starWarsDataSource") DataSource starWarsDataSource) {
43+
public DataSourceInitializer starWarsDataSourceInitializer(DataSource starWarsDataSource) {
4244
DataSourceInitializer dataSourceInitializer = new DataSourceInitializer();
4345
ResourceLoader resourceLoader = new DefaultResourceLoader();
4446

@@ -54,7 +56,6 @@ public DataSourceInitializer starWarsDataSourceInitializer(@Qualifier("starWarsD
5456

5557
@Bean
5658
@Primary
57-
@Qualifier("starWarsEntityManager")
5859
public LocalContainerEntityManagerFactoryBean starWarsEntityManagerFactory(
5960
EntityManagerFactoryBuilder builder) {
6061

@@ -73,13 +74,20 @@ public LocalContainerEntityManagerFactoryBean starWarsEntityManagerFactory(
7374
.build();
7475
}
7576

77+
@Bean
78+
public SharedEntityManagerBean starWarsEntityManager(EntityManagerFactory entityManager) {
79+
SharedEntityManagerBean bean = new SharedEntityManagerBean();
80+
bean.setEntityManagerFactory(entityManager);
81+
82+
return bean;
83+
}
7684
@Configuration
7785
public static class GraphQLJpaQuerySchemaConfigurer implements GraphQLSchemaConfigurer {
7886

7987
private final EntityManager entityManager;
8088

81-
public GraphQLJpaQuerySchemaConfigurer(@Qualifier("starWarsEntityManager") EntityManagerFactory entityManager) {
82-
this.entityManager = entityManager.createEntityManager();
89+
public GraphQLJpaQuerySchemaConfigurer(EntityManager starWarsEntityManager) {
90+
this.entityManager = starWarsEntityManager;
8391
}
8492

8593
@Override

graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/GraphQLJpaExecutor.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import javax.transaction.Transactional.TxType;
2424

2525
import com.introproventures.graphql.jpa.query.schema.GraphQLExecutor;
26+
2627
import graphql.ExecutionInput;
2728
import graphql.ExecutionResult;
2829
import graphql.GraphQL;
@@ -52,7 +53,7 @@ public GraphQLJpaExecutor(GraphQLSchema graphQLSchema) {
5253
* @see org.activiti.services.query.qraphql.jpa.QraphQLExecutor#execute(java.lang.String)
5354
*/
5455
@Override
55-
@Transactional(TxType.SUPPORTS)
56+
@Transactional(TxType.REQUIRES_NEW)
5657
public ExecutionResult execute(String query) {
5758
return execute(query, Collections.emptyMap());
5859
}
@@ -61,7 +62,7 @@ public ExecutionResult execute(String query) {
6162
* @see org.activiti.services.query.qraphql.jpa.QraphQLExecutor#execute(java.lang.String, java.util.Map)
6263
*/
6364
@Override
64-
@Transactional(TxType.SUPPORTS)
65+
@Transactional(TxType.REQUIRES_NEW)
6566
public ExecutionResult execute(String query, Map<String, Object> arguments) {
6667

6768
ExecutionInput executionInput = ExecutionInput.newExecutionInput()

0 commit comments

Comments
 (0)