java - AbstractRoutingDataSource + JPA 不会创建除 defaultTargetDataSource 之外的表

标签 java spring hibernate orm

我使用 JPA 注释(Hibernate 实现)来初始化我的数据库架构。我关注文章 DYNAMIC DATASOURCE ROUTING实现动态数据源路由类。

但是,我有两个数据库(映射了 2 个数据源)。我将第一个数据源设置为 defaultTargetDataSource。然后开始我的应用程序。当我的应用程序尝试访问第二个数据源时,它告诉我该表不存在。似乎 AbstractRoutingDataSource 只为默认数据源创建表,但为其他数据源创建表。

有没有在所有数据库中创建架构的想法?

PS.I 使用 AbstractRoutingDataSource 来实现我自己的数据库分片。

最佳答案

我猜你正在使用 hiberate 配置:

spring:
  jpa:
    hibernate:
      ddl-auto: update

以反射(reflect)对数据库架构的实体更改。只要我们使用配置为在启动时连接的单个数据源,就可以正常工作。

但是,如果您有多个数据源,则无法使用此功能。使用 AbstractRoutingDataSource 的一般方法是在启动时没有数据源而是在运行时选择它。

如果选择主数据源,那么它只会应用于主数据源,因为 hibernates 在启动时应用此功能,但不会迁移其余数据库。

要反射(reflect)对所有数据库的更改,您可以使用数据库迁移工具,例如 Flyway 或 Liquibase。

Flyway 使用 SQL,并且非常易于配置和使用。

关于java - AbstractRoutingDataSource + JPA 不会创建除 defaultTargetDataSource 之外的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10415284/

相关文章:

java - 字符串无法转换为int数组和ASCII

spring - 是否可以使用 Spring 的缓存抽象和 redis 创建多个缓存存储?

java - 是否可以禁用 spring batch 的跳过限制?

java - 如何拥有动态方法参数

java - 获取 403 : Forbidden when consuming SOAP service using apache cxf in java

java - org.springframework.beans.factory.BeanCreationException : Error creating bean with name 'projectTaskRepository'

java - 当我循环执行 Apache POI 时,未创建新工作表

java - hibernate 查询。 Actor 类

hibernate - 使用GORM保存方法时如何忽略域对象上的字段

java - 使用 Jersey 测试框架时 Servlet 上下文注入(inject)失败