0

在 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.customeracustomerb取决于配置,以及任何客户特定的验证/服务类以作用于新的 POJO。您会看到基础列可能不同。

但是,我犹豫是否要实施这一点,因为..

  • 几乎每个模型类都需要针对每个客户进行转换和实现,而不仅仅是那些不同的模型类。这是因为我们在模型类中有很多连接(OneToMany 等),Hibernate 不允许您连接到接口(例如HHH-4338
  • 需要某种 util/factory 来生成新的类实例,就像我们以前做new Properties我们不知道是使用new CustomerAProperties()还是new CustomerBProperties()一样(出于同样的原因,我们不能使用 TargetEntity 来解决上面的问题,因为这需要一个.class文件,不能在代码中设置)

这些似乎是相当主要的缺点,所以我正在尝试研究一种更好的方法来做到这一点。我们可以通过 Maven 为每个客户构建,但是我不确定如何以一种不会在我们本地开发时破坏 Eclipse 的方式来实现它。

或者,还有其他我不知道的方法吗?

提前感谢您对研究内容等的任何建议或指示。

4

1 回答 1

0

或者,还有其他我不知道的方法吗?

有什么理由不能从基于注释的映射切换到 xml 映射?

每个客户都会获得一组 XML 映射文件。现在,您只需要在模型在客户之间真正不同时进行子类化。

于 2012-10-22T17:09:13.173 回答