2015-02-02 18 views
14

Tôi đang sử dụng Spring Boot. Cuối cùng tôi đã quản lý để thiết lập hai nguồn dữ liệu, nhưng bây giờ tôi đang đối mặt với một vấn đề khác.Nhiều nguồn dữ liệu và tạo lược đồ trong Spring Boot

  1. với hai nguồn dữ liệu tại chỗ spring.jpa.hibernate.ddl-auto=create dường như ngừng làm việc trong ứng dụng khởi động mùa xuân của tôi, chỉ spring.jpa.generate-ddl=true làm việc tại

  2. tôi không thể quản lý để chọn chiến lược tự động tạo cho mỗi nguồn dữ liệu. Tôi muốn tạo lược đồ cho nguồn dữ liệu một, và chỉ sử dụng lược đồ đã tạo trong DB thứ hai với nguồn dữ liệu hai.

Mọi người đều có ý tưởng làm thế nào để giải quyết bất kỳ vấn đề nào trong số này? Lưu ý Tôi không muốn hoàn toàn vứt bỏ cấu hình tự động nếu có thể. Tôi thậm chí không biết, nếu hibernate có thể chỉ cần khởi tạo lược đồ trong một đơn vị persistence.

application.properties

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; 
    } 
} 

M.W.

+0

Không có lý do tại sao 'spring.jpa.hibernate.ddl- auto = create' sẽ ngừng hoạt động hoàn toàn vì bạn có hai DataSources. Spring Boot sẽ tự động cấu hình Hibernate để sử dụng bất kỳ DataSource nào là '@ Primary'. Tôi đoán rằng bạn đã thêm một số cấu hình bổ sung đã tắt cấu hình tự động của Hibernate nhưng không thể nói là bạn chưa cung cấp đủ thông tin để tạo lại các sự cố mà bạn đang cố giải quyết. –

+0

Tôi đã thêm một số đoạn mã. Tôi không rõ ràng về hai lựa chọn ở tất cả, tôi hầu như không nhìn thấy nơi họ thậm chí còn thiết lập, không có đề cập đến nơi chính xác họ được nối với mã. Dù sao quan trọng hơn đối với tôi là vấn đề thứ hai, làm thế nào để làm cho nó dữ liệu cụ thể. – Zveratko

+0

Kiểm tra liên kết này http://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html#howto-execute-flyway-database-migrations-on-startup –

Trả lời

15

spring.jpa.hibernate.ddl-auto=create đã ngừng làm việc, không có bởi vì bạn có hai DataSources, nhưng vì ứng dụng của bạn đang tạo một số của riêng mình là LocalContainerEntityManagerFactoryBean s. Điều này có tác dụng vô hiệu hóa cấu hình tự động của LocalContainerEntityManagerFactoryBean vì vậy bây giờ bạn phải tự cấu hình nó.

Bạn có thể cấu hình hai nhà quản lý thực thể có hành vi khác nhau thế hệ schema như thế này (người đầu tiên đang làm cập nhật, thứ hai đang làm tạo):

@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

Tôi đã làm theo lời khuyên của bạn. Ứng dụng này dường như đang hoạt động, nhưng điều kỳ lạ là tôi không thể nhìn thấy các bảng trong hsqldb (trong bộ nhớ), không phải là có thể là tôi cũng đã làm một cái gì đó với các giao dịch. Vì vậy, giao dịch vẫn được mở và chưa cam kết ?:( – Zveratko

+1

Tôi cũng nhận được rất nhiều 'org.hibernate.tool.hbm2ddl.SchemaExport: người dùng thiếu đặc quyền hoặc đối tượng không tìm thấy: PUBLIC.THÔNG BÁO ' – Zveratko

+1

Dường như quy trình HSQLDB không có sẵn cho [link] khác (http://stackoverflow.com/a/5080465/2944265) – Zveratko

Các vấn đề liên quan