我有一个带有数据库的旧版应用程序,该数据库将数据拆分为同一物理数据库上的多个架构。架构的结构相同。
我使用使用Spring Boot Data JPA的微服务来在单个架构上工作。然后,为了避免代码重复,我创建了一个路由器服务,该服务将请求转发到单个模式微服务副本,每个副本具有不同的数据库连接。但是我发现有点矫kill过正(但是有效)
我正在尝试将其缩减为单个微服务。我还没有成功,但是我使用schema
属性设置了表。
@Table(
name = "alerts",
schema = "ca"
)
但是,当我尝试进行继承和@MappedSuperclass
以减少代码重复时,它会感到困惑。
此外,@OneToMany
之所以分崩离析是因为继承得到了类似X references an unknown entity: Y
的错误
基本上,有一种在JPA上使用继承的方法,该方法使用相同的表结构,不同之处只是没有复制和粘贴太多代码的架构。理想情况下,我只想将“ schema”参数传递给DAO,并且它会以某种方式为我完成。
答案 0 :(得分:0)
最后,我们只需要一个可以根据情况进行路由的数据源。为此,使用扩展了@Component
的{{1}}和AbstractRoutingDataSource
来存储请求上下文。
ThreadLocal
可能是这样的(示例正在使用Lombok)
ThreadLocal
需要数据源:
@AllArgsConstructor
public class UserContext {
private static final ThreadLocal<UserContext> context =
new ThreadLocal<>();
private final String schema;
public static String getSchema() {
return context.get().schema;
}
public static void setFromXXX(...) {
context.set(new UserContext(
...
));
}
}
最后是标记为@Configuration
public class DataSources {
@Bean
public DataSource schema1() {
return build("schema1");
}
@Bean
public DataSource schema2() {
return build("schema2");
}
private DataSource buildDataSource(String schema) {
...
return new DriverManagerDataSource(url, username, password);
}
}
数据源的路由器,以确保它是供JPA使用的路由器。
@Primary
当所有不同之处都是模式甚至是数据源时,这避免了代码重复。