jakarta-ee-在不了解Hibernate中具体类的情况下映射关系



Hibernate中有很多关于抽象映射的主题,但我找不到与我的情况相匹配的内容。

问题:

我的域模型由几个实体组成,这些实体之间不相互继承。例如:

  • 员工
  • 部门
  • 报告

其中:

员工<->组(n:m),员工->部门(n:1)

就目前而言,没问题。但是:

我希望能够将Report映射到Employee、Group或Department中的任意一个(1:1)。(该示例被简化为Report应该可以映射到更多不同的其他实体)。每个实体都必须驻留在自己的表中,因为不同的外部对象希望连接到数据库,并且模型不会因其他实体的常规表结构而更改。

我尝试了什么

  1. 我尝试将Hibernate继承策略与Table per Class一起使用,而User、Employee和Department是从一个新的AbstractEntity中派生出来的,共享父类中的ID和Name属性。因此,User、Employee和Department仍然有自己的表。我现在可以映射报表<->AbstractEntity,这是有效的但是:正如人们所料,当报告超过20个左右时,这会导致严重的性能问题,因为Hibernate内部必须对所有子类表进行大量连接。

  2. 由于表结构发生了变化(请参阅问题),因此不能选择"每层次一个表"。此外,所有实体仅共享ID和名称作为公用属性。

可能的解决方案

一个可能的解决方案是由我自己实现映射。也就是说,我将Id和实体类存储在Report中。AbstractEntity的getter现在可以根据保存的值来决定从哪个表加载并返回正确的实体。

但是:这里的问题是,我不能在Entity类中执行会话,因为Report类不知道会话。此外,这会混淆逻辑层和模型层。

解决方法是在DAO中编写某种包装器,从数据库中加载正确的实体并将其注入到结果中。但这非常容易出错,因为每个DAO方法都必须被重写。

问题

所以我的问题是:有没有一种方法可以以某种方式捕获或拦截从数据库中检索报表实体,并在那里注入正确的抽象实体?

或者有没有另一种更优雅的方式来做我想做的事(必须是;)?

我使用Hibernate 3.6,在带有DAO的Java EE环境中使用Annotations而不使用EntityManager,如http://community.jboss.org/wiki/GenericDataAccessObjects.

我会采取相反的方法,将Report映射为每个类层次结构的表,并添加一个鉴别器列来确定它是Employee、Group还是Department报告。

相关内容

  • 没有找到相关文章

最新更新