1

I am using play framework with spring data JPA. I need to connect to multiple databases like db1, db2, db3.

persistence.xml

<persistence-unit name="db1" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <non-jta-data-source>db1</non-jta-data-source>
    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
        <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.format_sql" value="true"/>

    </properties>
</persistence-unit>
<persistence-unit name="db2" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <non-jta-data-source>db2</non-jta-data-source>
    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
        <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.format_sql" value="true"/>

    </properties>
</persistence-unit>
<persistence-unit name="db3" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <non-jta-data-source>db3</non-jta-data-source>
    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
        <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.format_sql" value="true"/>

    </properties>
</persistence-unit>

application.conf

db.db1.driver=com.mysql.jdbc.Driver
db.db1.url="mysql://root:root@localhost/db1?zeroDateTimeBehavior=convertToNull"
db.db1.user="root"
db.db1.password="root"
db.db1.jndiName=db1
db.db1.logSql=true

db.db2.driver=com.mysql.jdbc.Driver
db.db2.url="mysql://root:root@localhost/db2?zeroDateTimeBehavior=convertToNull"
db.db2.user="root"
db.db2.password="root"
db.db2.jndiName=db2
db.db2.logSql=true

db.db3.driver=com.mysql.jdbc.Driver
db.db3.url="mysql://root:root@localhost/db3?zeroDateTimeBehavior=convertToNull"
db.db3.user="root"
db.db3.password="root"
db.db3.jndiName=db3

Spring data configuration as defined in global.java I took it from sample project created from activator

@Configuration
@EnableJpaRepositories("models")
public static class SpringDataJpaConfiguration {

    @Bean
    public EntityManagerFactory entityManagerFactory() {
        return Persistence.createEntityManagerFactory("db1");
    }

    @Bean
    public HibernateExceptionTranslator hibernateExceptionTranslator() {
        return new HibernateExceptionTranslator();
    }

    @Bean
    public JpaTransactionManager transactionManager() {
        return new JpaTransactionManager();
    }
}

Now when I run my application it says

[info] play - datasource [mysql://root:root@localhost/db1?zeroDateTimeBehavior=convertToNull] bound to JNDI as db1
[info] play - datasource [mysql://root:root@localhost/db2?zeroDateTimeBehavior=convertToNull] bound to JNDI as db2
[info] play - datasource [mysql://root:root@localhost/db3?zeroDateTimeBehavior=convertToNull] bound to JNDI as db3
[info] play - database [db1] connected at jdbc:mysql://localhost/db1?zeroDateTimeBehavior=convertToNull
[info] play - database [db2] connected at jdbc:mysql://localhost/db2?zeroDateTimeBehavior=convertToNull
[info] play - database [db3] connected at jdbc:mysql://localhost/db3?zeroDateTimeBehavior=convertToNull
[info] play - Application started (Dev)

Now I am struggling to enable multiple entity manager as above configuration only allows to connect to db1 database. I tried creating multiple configuration in global.java but it overrides with last configuration. Please let me know how to use multiple entity manager ?

Tried to load multiple data sources using following link Spring Boot, Spring Data JPA with multiple DataSources but still getting error

play.api.UnexpectedException: Unexpected exception[UnsatisfiedDependencyException: Error creating bean with name 'attributeTypes' defined in file [/play-spring-data-jpa/target/scala-2.10/classes/controllers/catalog/AttributeTypes.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [models.repositories.data.AttributeTypeRepository]: Error creating bean with name 'attributeTypeRepository': Cannot create inner bean '(inner bean)#1b48832c' of type [org.springframework.orm.jpa.SharedEntityManagerCreator] while setting bean property 'entityManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#1b48832c': Cannot resolve reference to bean 'dataEntityManagerFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataConfig': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.springframework.orm.jpa.JpaVendorAdapter models.repositories.data.DataConfig.jpaVendorAdapter; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.orm.jpa.JpaVendorAdapter] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'attributeTypeRepository': Cannot create inner bean '(inner bean)#1b48832c' of type [org.springframework.orm.jpa.SharedEntityManagerCreator] while setting bean property 'entityManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#1b48832c': Cannot resolve reference to bean 'dataEntityManagerFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataConfig': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.springframework.orm.jpa.JpaVendorAdapter models.repositories.data.DataConfig.jpaVendorAdapter; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.orm.jpa.JpaVendorAdapter] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}]
at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(ApplicationProvider.scala:148) ~[play_2.10-2.2.0.jar:2.2.0]
at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(ApplicationProvider.scala:112) ~[play_2.10-2.2.0.jar:2.2.0]
at scala.Option.map(Option.scala:145) ~[scala-library.jar:na]
at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1.apply(ApplicationProvider.scala:112) ~[play_2.10-2.2.0.jar:2.2.0]
at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1.apply(ApplicationProvider.scala:110) ~[play_2.10-2.2.0.jar:2.2.0]
at scala.util.Success.flatMap(Try.scala:200) ~[scala-library.jar:na]
Community
  • 1
  • 1
n1005
  • 11
  • 2

1 Answers1

0

In the application.conf file, add a new line for each persistence unit like this:

jpa.<name>=<persistence-unit-name>

In your case:

jpa.default=db1
jpa.db2=db2
jpa.db3=db3
clayton.carmo
  • 121
  • 1
  • 4