Hibernate中有很多关于抽象映射的主题,但我找不到与我的情况相符的东西。
问题:
我的域模型由多个实体组成,这些实体不会相互继承。例如:
其中:
员工< - >集团(n:m), 员工 - >部门(n:1)
就这一点而言,没问题。但是:
我希望能够将报告映射到员工,组或部门(1:1)。 (该示例被简化为报告应该可以映射到更多不同的其他实体)。每个实体必须驻留在自己的表中,因为不同的外部要连接到数据库,并且不会更改关于其他实体的一般表结构的模型。
我尝试了什么
我尝试将Hibernate继承策略与Table per Class一起使用,而User,Employee和Department则从新的 AbstractEntity 创建子类,从父类共享ID和Name属性。因此,用户,员工和部门仍然拥有自己的表格。我现在可以映射报告< - > AbstractEntity ,这是有效的。 但:正如人们所预料的那样,当大约有20个左右的报告时,这会导致严重的性能问题,因为Hibernate内部必须在所有子类表上进行大量连接。
每个层次结构的单个表不是一个选项,因为表结构发生了变化(请参阅问题)。此外,所有实体仅共享ID和Name作为公共属性。
可能的解决方案
一种可能的解决方案是自己实现映射。也就是说,我将Id和实体类存储在Report中。 AbstractEntity的getter现在可以根据要加载的表的保存值来决定并返回正确的实体。
但是:问题在于,我无法在实体类中执行会话内容,因为Report类不知道会话。此外,这会混淆逻辑层和模型层。
解决方法是在DAO中编写某种包装器,从数据库加载正确的实体并将其注入到结果中。但这很容易出错,因为每个DAO方法都必须被覆盖。
问题
所以我的问题是:有没有办法以某种方式捕获或拦截从数据库中检索报告实体并在那里注入正确的AbstractEntity?
或者是否有另一种更优雅的方式来做我想做的事情(必须是;))?
我在使用带有DAO的Java EE环境中使用没有EntityManager的注释的Hibernate 3.6,如http://community.jboss.org/wiki/GenericDataAccessObjects。
答案 0 :(得分:1)
我采取相反的方法,因为我将报告映射为每个类层次结构的表,并添加一个鉴别器列以确定它是否是员工,组或部门报告。