具有多租户DB结构的ActiveJDBC

时间:2016-12-23 16:43:03

标签: java orm activejdbc javalite

我有一个多租户数据库架构。有没有办法将一个活动模型用于多个相同的数据库?

稍作澄清:

我有一个与Foo exdends Model一起使用的foo_table课程。 foo_table中的schemaA, schemaB, schameC是相同的。我可以使用相同的Foo类对来自不同模式的每个表进行操作吗?

1 个答案:

答案 0 :(得分:2)

如果您的数据库具有相同的模式,则可以在多个数据库中完全使用相同的模型。实际上,当人们从一个数据库到另一个数据库进行ETL时,通常会这样做。

典型的程序如下:

Base.open(/*connection params*/);
List<Person> johns = Person.where("first_name = ?", "John");
Base.close();
  • Base.open()打开一个连接并将其附加到当前线程。
  • 下一行Person.where(..)在线程上找到连接,并使用它来选择记录。
  • Base.close()在当前线程上找到一个连接并关闭它。

此外,ActiveJDBC模型首次在JVM中使用时,将期望在当前线程上建立连接,并从当前模式中提取元数据。这将确保:

这意味着在任何给定时间,模型都假定它连接到具有用于获取元数据的相同结构的数据库。

接下来,这可能是你想要的:

Base.open(/*connection params for DB1*/);
List<Person> johns = Person.where("first_name = ?", "John");
Base.close();

Base.open(/*connection params for DB2*/);
for(Person person:johns){
    person.set("first_name", "Bill").setId(null).saveIt();
}
Base.close();

基本上,您将从一个数据库中读取数据,但会将其保存到另一个数据库中。

需要调用person.setId(null)以确保框架生成插入,而不是更新,请参阅http://javalite.io/surrogate_primary_keys