Java Spring boot JPA设置自定义数据源

Java Spring boot JPA设置自定义数据源,java,spring-boot,datasource,Java,Spring Boot,Datasource,我定义了2个数据源- #datasource jndi setup database.datasources[1].jndi-name=jdbc/yyyy database.datasources[1].username=yyyy database.datasources[1].password=yyyyy database.datasources[1].url=jdbc:oracle:thin:@localhost:2222:webtst database.datasources[1].dri

我定义了2个数据源-

#datasource jndi setup
database.datasources[1].jndi-name=jdbc/yyyy
database.datasources[1].username=yyyy
database.datasources[1].password=yyyyy
database.datasources[1].url=jdbc:oracle:thin:@localhost:2222:webtst
database.datasources[1].driverClassName=oracle.jdbc.OracleDriver
database.datasources[1].factory=org.apache.tomcat.jdbc.pool.DataSourceFactory
database.datasources[1].initialSize=1
database.datasources[1].maxActive=5

database.datasources[0].jndi-name=jdbc/xxx
database.datasources[0].username=xxx
database.datasources[0].password=xxxx
database.datasources[0].url=jdbc:oracle:thin:@localhost:2222:webtst
database.datasources[0].driverClassName=oracle.jdbc.OracleDriver
database.datasources[0].factory=org.apache.tomcat.jdbc.pool.DataSourceFactory
database.datasources[0].initialSize=1
database.datasources[0].maxActive=15 
和2个匹配的JPA存储库,在我将其中一个定义为@primary之后,如何将其中一个设置为使用不同的ds(而不是主ds):

@Bean
@Primary
DataSource dataSource() throws SQLException {
    OracleDataSource dataSource = new OracleDataSource();
    dataSource.setUser(xusername);
    dataSource.setPassword(xpassword);
    dataSource.setURL(xurl);

    dataSource.setImplicitCachingEnabled(true);
    dataSource.setFastConnectionFailoverEnabled(true);
    return dataSource;
}



@Bean
DataSource propsDataSource() throws SQLException {
    OracleDataSource propsDataSource = new OracleDataSource();
    //propsDataSource.setDataSourceName(secJNDIName);
    propsDataSource.setUser(yUserName);
    propsDataSource.setPassword(ypropsPassword);
    propsDataSource.setURL(upropsUrl);
    propsDataSource.setImplicitCachingEnabled(true);
    propsDataSource.setFastConnectionFailoverEnabled(true);
    return propsDataSource;
}
还有一个简单的JPA假设,我希望它使用seconday数据源:

public interface AttributesRepo extends JpaRepository<PRODUCTATTRIBUTE, PRODUCTATTRIBUTE_KEY> {

}
公共接口属性repo扩展了JpaRepository{
}
您需要:

  • 定义两个
    DataSource
  • 将其中一个标记为
    @Primary
    (就像您所做的那样)
  • 使用不同的
    数据源定义两个
    LocalContainerEntityManagerFactoryBean
    em1
    em2
  • 定义两个
    TransactionManager
  • 将所有应使用第一个数据源的存储库放入package
    pkg1
    中,并将其他存储库放入package
    pkg2
  • 使用
    basePackages=“pkg1”
    entityManagerFactoryRef=“em1”
  • ant是
    pkg2
    em2
如所述。

您需要:

  • 定义两个
    DataSource
  • 将其中一个标记为
    @Primary
    (就像您所做的那样)
  • 使用不同的
    数据源定义两个
    LocalContainerEntityManagerFactoryBean
    em1
    em2
  • 定义两个
    TransactionManager
  • 将所有应使用第一个数据源的存储库放入package
    pkg1
    中,并将其他存储库放入package
    pkg2
  • 使用
    basePackages=“pkg1”
    entityManagerFactoryRef=“em1”
  • ant是
    pkg2
    em2

如中所述。

我使用两个数据源。这是我的applicationContext.xml:

<?xml version = "1.0" encoding = "UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:util="http://www.springframework.org/schema/util"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:tx="http://www.springframework.org/schema/tx"
   xmlns:jpa="http://www.springframework.org/schema/data/jpa"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans.xsd
   http://www.springframework.org/schema/context
   http://www.springframework.org/schema/context/spring-context.xsd
   http://www.springframework.org/schema/tx
   http://www.springframework.org/schema/tx/spring-tx.xsd
   http://www.springframework.org/schema/util
   http://www.springframework.org/schema/util/spring-util.xsd
   http://www.springframework.org/schema/data/jpa
   http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
   http://www.springframework.org/schema/data/jpa
   http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">

<jpa:repositories base-package="nl.christine.schwartze.server"/>

<context:property-placeholder location="classpath:/META-INF/database.properties"/>

<context:component-scan base-package="nl.christine.schwartze.server"/>

<bean class="org.apache.commons.dbcp2.BasicDataSource"
      destroy-method="close" id="dataSource">
    <property name="driverClassName" value="${database.driverClassName}"/>
    <property name="url" value="${database.url}"/>
    <property name="username" value="${database.username}"/>
    <property name="password" value="${database.password}"/>
</bean>

<bean class="org.apache.commons.dbcp2.BasicDataSource"
      destroy-method="close" id="importDataSource">
    <property name="driverClassName" value="${database.driverClassName}"/>
    <property name="url" value="${importDatabase.url}"/>
    <property name="username" value="${database.username}"/>
    <property name="password" value="${database.password}"/>
</bean>

<bean id="entityManagerFactory"
      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="defaultPU"/>
    <property name="dataSource" ref="dataSource"/>
    <property name="packagesToScan" value="nl.christine.schwartze.server.model"/>
    <property name="jpaVendorAdapter" ref="hibernateVendorAdapter"/>
    <property name="jpaProperties" ref="props"/>
    <property name="persistenceProvider">
        <bean class="org.hibernate.jpa.HibernatePersistenceProvider"/>
    </property>
</bean>

<bean id="importEntityManagerFactory"
      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="importPU"/>
    <property name="dataSource" ref="importDataSource"/>
    <property name="packagesToScan" value="nl.christine.schwartze.server.modelimport"/>
    <property name="jpaVendorAdapter" ref="hibernateVendorAdapter"/>
    <property name="jpaProperties" ref="importprops"/>
    <property name="persistenceProvider">
        <bean class="org.hibernate.jpa.HibernatePersistenceProvider"/>
    </property>
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<bean id="importTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="importEntityManagerFactory" />
</bean>

<bean id="hibernateVendorAdapter"
      class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>

<util:properties id="props">
    <prop key="hibernate.show_sql">true</prop>
    <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQL82Dialect</prop>
    <prop key="hibernate.hbm2ddl.auto">${database.createorvalidate}</prop>
    <prop key="hibernate.ddl-auto">${database.createorvalidate}</prop>
    <prop key="spring.jpa.show-sql">true</prop>
    <prop key="spring.jpa.generate.ddl">true</prop>
    <prop key="spring.jpa.hibernate.ddl-auto">${database.createorvalidate}</prop>
    <prop key="spring.datasource.initialization-mode">never</prop>
    <prop key="spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation">true</prop>
</util:properties>

<util:properties id="importprops">
    <prop key="hibernate.show_sql">true</prop>
    <prop key="hibernate.id.new_generator_mappings">false</prop>
    <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQL82Dialect</prop>
    <prop key="hibernate.hbm2ddl.auto">validate</prop>
    <prop key="hibernate.ddl-auto">validate</prop>
    <prop key="spring.jpa.show-sql">true</prop>
    <prop key="spring.jpa.generate.ddl">true</prop>
    <prop key="spring.jpa.hibernate.ddl-auto">validate</prop>
    <prop key="spring.datasource.initialization-mode">never</prop>
    <prop key="spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation">true</prop>
</util:properties>

<bean id="importLetterDao" class="nl.christine.schwartze.server.daoimport.impl.ImportLetterDaoImpl" scope="singleton">
</bean>

<bean id="letterDao" class="nl.christine.schwartze.server.dao.impl.LetterDaoImpl" scope="singleton">
</bean>

<bean id="locationDao" class="nl.christine.schwartze.server.dao.impl.LocationDaoImpl" scope="singleton">
</bean>

<bean id="personDao" class="nl.christine.schwartze.server.dao.impl.PersonDaoImpl" scope="singleton">
</bean>

<bean id="letterService" class="nl.christine.schwartze.server.service.impl.LetterServiceImpl" scope="singleton">
</bean>

<bean id="logger" scope="prototype" class="org.slf4j.LoggerFactory" factory-method="getLogger">
    <constructor-arg name="name" value="schwartzeLogger" />
</bean>
以下是我在控制器方法上的注释:

   @CrossOrigin(origins = "http://pengo.christine.nl:3000")
@RequestMapping(method = RequestMethod.POST, value = "/get_letters/")
@Transactional("transactionManager")
public ResponseEntity<LettersResult> getLetters(@RequestBody LettersRequest request) {
...
@交叉原点(原点=”http://pengo.christine.nl:3000")
@RequestMapping(method=RequestMethod.POST,value=“/get_letters/”)
@事务性(“transactionManager”)
公共响应权限getLetters(@RequestBody LettersRequest){
...

示例项目。

我使用两个数据源。这是我的applicationContext.xml:

<?xml version = "1.0" encoding = "UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:util="http://www.springframework.org/schema/util"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:tx="http://www.springframework.org/schema/tx"
   xmlns:jpa="http://www.springframework.org/schema/data/jpa"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans.xsd
   http://www.springframework.org/schema/context
   http://www.springframework.org/schema/context/spring-context.xsd
   http://www.springframework.org/schema/tx
   http://www.springframework.org/schema/tx/spring-tx.xsd
   http://www.springframework.org/schema/util
   http://www.springframework.org/schema/util/spring-util.xsd
   http://www.springframework.org/schema/data/jpa
   http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
   http://www.springframework.org/schema/data/jpa
   http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">

<jpa:repositories base-package="nl.christine.schwartze.server"/>

<context:property-placeholder location="classpath:/META-INF/database.properties"/>

<context:component-scan base-package="nl.christine.schwartze.server"/>

<bean class="org.apache.commons.dbcp2.BasicDataSource"
      destroy-method="close" id="dataSource">
    <property name="driverClassName" value="${database.driverClassName}"/>
    <property name="url" value="${database.url}"/>
    <property name="username" value="${database.username}"/>
    <property name="password" value="${database.password}"/>
</bean>

<bean class="org.apache.commons.dbcp2.BasicDataSource"
      destroy-method="close" id="importDataSource">
    <property name="driverClassName" value="${database.driverClassName}"/>
    <property name="url" value="${importDatabase.url}"/>
    <property name="username" value="${database.username}"/>
    <property name="password" value="${database.password}"/>
</bean>

<bean id="entityManagerFactory"
      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="defaultPU"/>
    <property name="dataSource" ref="dataSource"/>
    <property name="packagesToScan" value="nl.christine.schwartze.server.model"/>
    <property name="jpaVendorAdapter" ref="hibernateVendorAdapter"/>
    <property name="jpaProperties" ref="props"/>
    <property name="persistenceProvider">
        <bean class="org.hibernate.jpa.HibernatePersistenceProvider"/>
    </property>
</bean>

<bean id="importEntityManagerFactory"
      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="importPU"/>
    <property name="dataSource" ref="importDataSource"/>
    <property name="packagesToScan" value="nl.christine.schwartze.server.modelimport"/>
    <property name="jpaVendorAdapter" ref="hibernateVendorAdapter"/>
    <property name="jpaProperties" ref="importprops"/>
    <property name="persistenceProvider">
        <bean class="org.hibernate.jpa.HibernatePersistenceProvider"/>
    </property>
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<bean id="importTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="importEntityManagerFactory" />
</bean>

<bean id="hibernateVendorAdapter"
      class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>

<util:properties id="props">
    <prop key="hibernate.show_sql">true</prop>
    <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQL82Dialect</prop>
    <prop key="hibernate.hbm2ddl.auto">${database.createorvalidate}</prop>
    <prop key="hibernate.ddl-auto">${database.createorvalidate}</prop>
    <prop key="spring.jpa.show-sql">true</prop>
    <prop key="spring.jpa.generate.ddl">true</prop>
    <prop key="spring.jpa.hibernate.ddl-auto">${database.createorvalidate}</prop>
    <prop key="spring.datasource.initialization-mode">never</prop>
    <prop key="spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation">true</prop>
</util:properties>

<util:properties id="importprops">
    <prop key="hibernate.show_sql">true</prop>
    <prop key="hibernate.id.new_generator_mappings">false</prop>
    <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQL82Dialect</prop>
    <prop key="hibernate.hbm2ddl.auto">validate</prop>
    <prop key="hibernate.ddl-auto">validate</prop>
    <prop key="spring.jpa.show-sql">true</prop>
    <prop key="spring.jpa.generate.ddl">true</prop>
    <prop key="spring.jpa.hibernate.ddl-auto">validate</prop>
    <prop key="spring.datasource.initialization-mode">never</prop>
    <prop key="spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation">true</prop>
</util:properties>

<bean id="importLetterDao" class="nl.christine.schwartze.server.daoimport.impl.ImportLetterDaoImpl" scope="singleton">
</bean>

<bean id="letterDao" class="nl.christine.schwartze.server.dao.impl.LetterDaoImpl" scope="singleton">
</bean>

<bean id="locationDao" class="nl.christine.schwartze.server.dao.impl.LocationDaoImpl" scope="singleton">
</bean>

<bean id="personDao" class="nl.christine.schwartze.server.dao.impl.PersonDaoImpl" scope="singleton">
</bean>

<bean id="letterService" class="nl.christine.schwartze.server.service.impl.LetterServiceImpl" scope="singleton">
</bean>

<bean id="logger" scope="prototype" class="org.slf4j.LoggerFactory" factory-method="getLogger">
    <constructor-arg name="name" value="schwartzeLogger" />
</bean>
以下是我在控制器方法上的注释:

   @CrossOrigin(origins = "http://pengo.christine.nl:3000")
@RequestMapping(method = RequestMethod.POST, value = "/get_letters/")
@Transactional("transactionManager")
public ResponseEntity<LettersResult> getLetters(@RequestBody LettersRequest request) {
...
@交叉原点(原点=”http://pengo.christine.nl:3000")
@RequestMapping(method=RequestMethod.POST,value=“/get_letters/”)
@事务性(“transactionManager”)
公共响应权限getLetters(@RequestBody LettersRequest){
...

项目示例。

当您没有applicationContext.xml时的好方法当您没有applicationContext.xml时的好方法它应该如何工作?我尝试过这样做,但不是用xml,而是用Java配置。它甚至不应该编译,因为
JpaTransactionManager.setEntityManagerFactory()
需要一个
emf
bean,而不是工厂bean。您正在传递
ImportEntityManager
。我不明白它。:/它应该如何工作?我尝试过这样做,但不是用xml,而是用Java配置。它甚至不应该编译,因为
JpaTransactionManager.setEntityManager()
需要的是
emf
bean,而不是工厂bean。您正在传递
importEntityManagerFactory
。我不明白:/