0

Я видел подобные вопросы здесь, но не смог найти ответ, который действительно работает для меня.Spring JPA Несколько источников данных

У меня есть 2 разных источника данных, каждый из которых имеет свой собственный менеджер транзакций и фабрику управления сущностями. Они каждый из которых определены в своем собственном классе конфигурации:

@Configuration 
@ComponentScan({ 
"com.sprint.cst.data.v8p", 
"com.sprint.v8p.data", 
"com.sprint.v8p.data.util", 
"com.sprint.v8p.toptower.repositories", 
"com.sprint.v8p.toptower.util"}) 
@EnableTransactionManagement 
@EnableJpaRepositories(basePackages = { 
    "com.sprint.cst.data.v8p.repository", 
    "com.sprint.v8p.repository", 
    "com.sprint.eib.data" }) 
public class JpaConfiguration { 

@Value("${cst.db.generateDdl:true}") 
boolean generateDdl; 
String ddlGenerationStrategy = "create-or-extend-tables"; 
@Value("${cst.db.showSql:true}") 
boolean showSql; 

private String[] defaultEntityPackagesToScan = 
     new String[]{ 
     "com.sprint.v8p.domain", 
     "com.sprint.v8p.toptower.domain", 
     "com.sprint.cst.data.v8p.entity", 
     "com.sprint.eib.entity"}; 

private JpaDialect jpaDialect = new EclipseLinkJpaDialect(); 


/// Primary JPA 
@Primary 
@Autowired 
@Bean(name = "entityManagerFactory") 
@Qualifier("entityManagerFactory") 
public LocalContainerEntityManagerFactoryBean defaultEntityManagerFactory(DataSource dataSource) { 
    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 
    //em.setPersistenceUnitName(UnitNames.DefaultPersistenceUnit); 
    em.setDataSource(dataSource); 
    em.setPackagesToScan(defaultEntityPackagesToScan); 
    em.setJpaVendorAdapter(vendorAdapter()); 
    em.setJpaDialect(jpaDialect); 
    em.setJpaProperties(defaultJpaProperties()); 
    return em; 
} 

@Primary 
@Bean(name="transactionManager") 
public PlatformTransactionManager defaultTransactionManager(
     EntityManagerFactory emf) { 
    JpaTransactionManager transactionManager = new JpaTransactionManager(); 
    transactionManager.setEntityManagerFactory(emf); 

    return transactionManager; 
} 

//'Datasource' Transaction Manager 
//leveraged by ice events functionality; batch inserts/updates 
@Autowired 
@Bean(name="dsTransactionManager") 
public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource) { 
    DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(); 
    dataSourceTransactionManager.setDataSource(dataSource); 
    return dataSourceTransactionManager; 
} 


/// Other Beans 

@Bean 
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() { 
    return new PersistenceExceptionTranslationPostProcessor(); 
} 

@Bean 
public PersistenceAnnotationBeanPostProcessor persistenceAnnotationBeanPostProcessor(){ 
    return new PersistenceAnnotationBeanPostProcessor(); 
} 

И: есть

@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories(
    basePackages = { 
     "com.sprint.cst.data.v8p.sp2.repository"}, 
    entityManagerFactoryRef="sp2EntityManagerFactory", 
    transactionManagerRef="sp2TransactionManager") 
public class JpaSp2Configuration { 

@Value("${cst.db.generateDdl:true}") 
boolean generateDdl; 
//@Value("${cst.db.eclipselink.ddl-generation:'create-or-extend-tables'}") 
String ddlGenerationStrategy = "create-or-extend-tables"; 
@Value("${cst.db.showSql:true}") 
boolean showSql; 

private String[] sp2EntityPackagesToScan = 
     new String[]{ 
     "com.sprint.cst.data.v8p.sp2.entity"}; 

private JpaDialect jpaDialect = new EclipseLinkJpaDialect(); 

static final String sp2DataSourceJNDIName = "jdbc/cst-ds-sp2"; 

/// Secondary JPA 
@Bean(name= "sp2EntityManagerFactory") 
@Qualifier("sp2EntityManagerFactory") 
public LocalContainerEntityManagerFactoryBean sp2EntityManagerFactory(@Qualifier("sp2DataSource") DataSource sp2DataSource) { 
    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 
    em.setBeanName("sp2EntityManagerFactory"); 
    //em.setPersistenceUnitName(UnitNames.Sp2PersistenceUnit); 
    em.setDataSource(sp2DataSource); 
    em.setPackagesToScan(sp2EntityPackagesToScan); 
    em.setJpaVendorAdapter(vendorAdapter()); 
    em.setJpaDialect(jpaDialect); 
    em.setJpaProperties(defaultJpaProperties()); 
    return em; 
} 

@Autowired 
@Bean(name="sp2TransactionManager") 
@Qualifier("sp2TransactionManager") 
public PlatformTransactionManager sp2TransactionManager(
     @Qualifier("sp2EntityManagerFactory") LocalContainerEntityManagerFactoryBean sp2EntityManagerFactory) { 
    JpaTransactionManager transactionManager = new JpaTransactionManager(); 
    transactionManager.setEntityManagerFactory(sp2EntityManagerFactory.getNativeEntityManagerFactory()); 
    //transactionManager.setPersistenceUnitName(UnitNames.Sp2PersistenceUnit); 
    return transactionManager; 
} 

Источников данных в отдельном источнике данных конфигурации. «Первичные» функции работают нормально, функции «SP2» - нет. Например:

@Transactional("sp2TransactionManager") 
@Override 
public void saveCallHistory(CallHistoryObject callHistoryObject) { 
    . 
    . 
    . 

    SolutionInfoEntity solutionInfoResult = solutionInfoRepository.save(callHistoryObject.getSolutionInfoEntity()); 
    SolutionInfoEntity save = solutionInfoRepository.findOne(callHistoryObject.getSolutionInfoEntity().getSp2Id()); 

«Сохранить» объект здесь на самом деле возвращает результат, но ничего фактически не сохраняется в БД. Есть идеи? Я чувствую, что пробовал почти все.

ответ

0

Убедитесь, что ваши репозитории находятся в разных пакетах (не менее 1 на источник данных). И в конфигурации, где у вас есть

@EnableJpaRepositories(basePackages = { 
"com.sprint.cst.data.v8p.repository", 
"com.sprint.v8p.repository", 
"com.sprint.eib.data" }) 

В каждом соединении должны быть включены только те репозитории.

Например, если DataSource (DS1) работает на упаковке

com.spring.ds1.repository 

и DataSource (DS2) работает на упаковке

com.spring.ds2.repository 

Конфигурация JpaRepositories будет выглядеть следующим образом

В DS1 конфигурация

@EnableJpaRepositories(basePackages = {"com.spring.ds1.repository"}) 

В конфигурации DS2

@EnableJpaRepositories(basePackages = {"com.spring.ds2.repository"}) 

Я имел аналогичные проблемы с Кассандрой и с описанной выше конфигурации, я был в состоянии решить.

0

Сегодня я столкнулся с тем же самым состоянием и нашел методы, определенные в реализации JPARepository (SimpleJAPRepository.java), предоставленные весной, не будут работать во втором соединении с базой данных. Я объясняю свои выводы http://umeshrsharma.blogspot.in/2016/03/spring-data-jpa-with-multiple-database.html. Возможно, я ошибаюсь или не вижу в настройке. но все же моя основная функция JPA не работает, но функция определения пользователя работает. Если кто-то решил это, объясните немного.

 Смежные вопросы

  • Нет связанных вопросов^_^