2015-02-02 16 views
14

Spring Boot kullanıyorum. Sonunda iki veri kaynağı kurmayı başardım ama şimdi başka bir sorunla karşı karşıyayım. yerinde spring.jpa.hibernate.ddl-auto=create iki veri kaynaklarıylaSpring Boot'da birden çok veri kaynağı ve şema oluşturma

  1. , sadece spring.jpa.generate-ddl=true görevi biraz

  2. ben yönetemez do her biri için otomatik oluşturma stratejisi seçmek için benim bahar önyükleme uygulamasında durmasına görünüyor veri kaynakları. Veri kaynağı için bir şema oluşturmayı tercih ederim ve sadece ikinci şemada yaratılan şemayı iki veri kaynağı ile kullanıyorum.

Bu sorunlardan herhangi birinin nasıl çözüleceği konusunda bir fikriniz var mı? Not Mümkünse otomatik yapılandırmayı tamamen atmak istemiyorum. Henüz hazır değilim, eğer hazırda bekletme tek bir kalıcılık biriminde şemayı başlatabilirse.

hayır, çalışmayı durdurdu

spring.datasource-internal.url=jdbc:hsqldb:mem:testdb 
spring.datasource-internal.username=sa 
spring.datasource-internal.password=sa 
spring.datasource-internal.driver-class-name=org.hsqldb.jdbcDriver 
spring.datasource-internal.jpa.database-platform=org.hibernate.dialect.HSQLDialect 

spring.datasource-external.url=jdbc:hsqldb:mem:testexternal 
spring.datasource-external.username=sa 
spring.datasource-external.password=sa 
spring.datasource-external.driver-class-name=org.hsqldb.jdbcDriver 
spring.datasource-external.jpa.database-platform=org.hibernate.dialect.HSQLDialect 

flyway.enabled=false 
spring.jpa.hibernate.ddl-auto=create 
spring.jpa.show-sql=true 
spring.jpa.generate-ddl=true 

DBInternalConfig

@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories(basePackages = "cz.data.internal", 
     entityManagerFactoryRef = "internalEntityManagerFactory", 
     transactionManagerRef = "internalTransactionManager") 
public class DBConfigInternal { 


    public static final String INTERNAL = "internal"; 

    @Bean(name = "internalDataSource") 
    @Primary 
    @ConfigurationProperties(prefix = "spring.datasource-internal") 
    public DataSource internalDataSource() { 
     return DataSourceBuilder.create().build(); 
    } 

    @Bean(name = "internalEntityManagerFactory") 
    @Primary 
    public LocalContainerEntityManagerFactoryBean internalEntityManagerFactory(
      EntityManagerFactoryBuilder builder) { 
     return builder 
       .dataSource(internalDataSource()) 
       .packages("cz.data.internal.entity") 
       .persistenceUnit(INTERNAL) 
       .build(); 
    } 

    @Bean(name = "internalTransactionManager") 
    @Primary 
    public PlatformTransactionManager internalTransactionManager() { 
     JpaTransactionManager jpaTransactionManager = new JpaTransactionManager(); 
     jpaTransactionManager.setDataSource(internalDataSource()); 
     jpaTransactionManager.setPersistenceUnitName(INTERNAL); 
     return jpaTransactionManager; 
    } 
} 

DBExternalConfig

@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories(
     basePackages = "cz.data.external", 
     entityManagerFactoryRef = "externalEntityManagerFactory", 
     transactionManagerRef = "externalTransactionManager") 
public class DBConfigExternal { 


    public static final String EXTERNAL = "external"; 

    @Bean(name = "externalDataSource") 
    @ConfigurationProperties(prefix = "spring.datasource-external") 
    public DataSource externalDataSource() { 
     return DataSourceBuilder.create().build(); 
    } 

    @Bean(name = "externalEntityManagerFactory") 
    public LocalContainerEntityManagerFactoryBean externalEntityManagerFactory(
      EntityManagerFactoryBuilder builder) { 
     return builder 
       .dataSource(externalDataSource()) 
       .packages("cz.data.external.entity") 
       .persistenceUnit(EXTERNAL) 
       .build(); 
    } 

    @Bean(name = "externalTransactionManager") 
    public PlatformTransactionManager externalTransactionManager() { 
     JpaTransactionManager jpaTransactionManager = new JpaTransactionManager(); 
     jpaTransactionManager.setDataSource(externalDataSource()); 
     jpaTransactionManager.setPersistenceUnitName(EXTERNAL); 
     return jpaTransactionManager; 
    } 
} 

MW

+0

:

Böyle farklı şema nesil davranışını (ilk güncelleştirme yapıyor, ikinci oluşturmak yapıyor) sahip iki varlık yöneticileri yapılandırabilirsiniz auto = create', yalnızca iki DataSource'ınız olduğu için çalışmayı bırakmalıdır. Spring Boot, sadece, DataSource'un @ Primary olduğunu anlamak için Hazırda bekletme ayarını otomatik olarak yapılandıracaktır. Hazırda bekletme modunun otomatik yapılandırmasını kapatan bazı ek yapılandırmalar eklediğinizi tahmin ediyorum, ancak çözmeye çalıştığınız sorunları yeniden oluşturmak için yeterli bilgi sağlamadığınız için bunu söylemek imkansız. –

+0

Bazı kod snippet'lerini ekledim. İki seçenek hakkında çok net değilim, nerede olduklarını bile göremiyorum, kodlara tam olarak nerede takıldıklarını söylemek zor değil. Her neyse benim için daha önemli olan ikinci konu, veri kaynağının nasıl spesifik hale getirileceğidir. – Zveratko

+0

Bu bağlantıyı kontrol edin http://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html#howto-execute-flyway-database-migrations-on-startup –

cevap

15

spring.jpa.hibernate.ddl-auto=create application.properties çünkü iki DataSource var, ancak uygulamanızın kendi LocalContainerEntityManagerFactoryBean s'yi yaratması nedeniyle. Bu, LocalContainerEntityManagerFactoryBean'un otomatik yapılandırmasını devre dışı bırakmanın etkisine sahiptir, böylece şimdi bunu kendiniz yapılandırmanız gerekir. hiçbir neden neden `spring.jpa.hibernate.ddl- var

@Bean(name = "externalEntityManagerFactory") 
public LocalContainerEntityManagerFactoryBean externalEntityManagerFactory(
     EntityManagerFactoryBuilder builder) { 
    Map<String, Object> properties = new HashMap<String, Object>(); 
    properties.put("hibernate.hbm2ddl.auto", "update"); 
    return builder 
      .dataSource(externalDataSource()) 
      .packages("cz.data.external.entity") 
      .persistenceUnit(EXTERNAL) 
      .properties(properties) 
      .build(); 
} 

@Bean(name = "internalEntityManagerFactory") 
@Primary 
public LocalContainerEntityManagerFactoryBean internalEntityManagerFactory(
     EntityManagerFactoryBuilder builder) { 
    Map<String, Object> properties = new HashMap<String, Object>(); 
    properties.put("hibernate.hbm2ddl.auto", "create"); 
    return builder 
      .dataSource(internalDataSource()) 
      .packages("cz.data.internal.entity") 
      .persistenceUnit(INTERNAL) 
      .properties(properties) 
      .build(); 
} 
+0

Senin tavsiyeni takip ettim. Uygulama çalışıyor gibi görünüyor, ama tuhaf bir şey ben hsqldb (bellek) tabloları görmek mümkün değil, aynı zamanda işlemleri ile bir şey vidalı olması mümkün olmamalıdır. Yani işlem hala açıldı ve henüz değil? :( – Zveratko

+1

Ben de çok sayıda org.hibernate.tool.hbm2ddl.SchemaExport alıyorum: kullanıcı ayrıcalık veya nesne bulunamadı: KAMU.BİLDİRİM ' – Zveratko

+1

HSQLDB işleminin diğer [bağlantı] için uygun olmadığını görünüyor (http://stackoverflow.com/a/5080465/2944265) – Zveratko

İlgili konular