在 Spring / Hibernate 组合中使用多个数据库“模型”的公认做法是什么?
对于让我摸不着头脑的问题,我将不胜感激,因为我不是 Spring/Hibernate 方面的专家!
我们正在开发一个 Web 项目,到目前为止,该项目已按照其第一个客户的规范构建。所有数据库表都映射到 POJO,我们使用 Hibernate Annotations。很简单,该项目是一个 CRUD 应用程序,它允许最终用户通过前端更新数据库信息。
我们现在需要支持一个新客户,但是这个客户的规格略有不同;我们将对许多表的列和数据类型进行更改。
我们不想合并到一个表中,因为这会使数据库中包含大量 NULL 列(某些表中每个客户将有 10 多个唯一列)。
我们可以很容易地处理前端,因为我们只是在 JSON 之间进行转换,并且前端已经从头开始为每个客户实现。但是后端有点复杂。
我们尝试了一个原型,我们在运行时覆盖了两个表;我们将两个相应的模型类转换为接口,并为每个客户实现一个具体的类,通过 Spring 配置加载,例如对于“产品”表,我们尝试:
package com.mycompany.generic.model;
public interface Product
接着
package com.mycompany.customera.model;
@Table(name="products")
public class CustomerAProduct implements Properties {
String colour;
int weight;
}
或者
package com.mycompany.customerb.model;
@Table(name="products")
public class CustomerBProduct implements Properties {
String colour;
int volume;
Double price;
}
..作为运行时选项,Spring 加载com.mycompany.customera或customerb取决于配置,以及任何客户特定的验证/服务类以作用于新的 POJO。您会看到基础列可能不同。
但是,我犹豫是否要实施这一点,因为..
- 几乎每个模型类都需要针对每个客户进行转换和实现,而不仅仅是那些不同的模型类。这是因为我们在模型类中有很多连接(OneToMany 等),Hibernate 不允许您连接到接口(例如HHH-4338)
- 需要某种 util/factory 来生成新的类实例,就像我们以前做new Properties我们不知道是使用new CustomerAProperties()还是new CustomerBProperties()一样(出于同样的原因,我们不能使用 TargetEntity 来解决上面的问题,因为这需要一个.class文件,不能在代码中设置)
这些似乎是相当主要的缺点,所以我正在尝试研究一种更好的方法来做到这一点。我们可以通过 Maven 为每个客户构建,但是我不确定如何以一种不会在我们本地开发时破坏 Eclipse 的方式来实现它。
或者,还有其他我不知道的方法吗?
提前感谢您对研究内容等的任何建议或指示。