在Hibernate中映射关系而不知道具体类

在Hibernate中映射关系而不知道具体类,hibernate,jakarta-ee,mapping,abstract,database-relations,Hibernate,Jakarta Ee,Mapping,Abstract,Database Relations,Hibernate中有很多关于抽象映射的主题,但我找不到与我的案例相匹配的内容 问题: 我的域模型由多个实体组成,这些实体彼此不继承。例如: 雇员 团体 系 报告 其中: 员工组(n:m), 员工->部门(n:1) 就这一点而言,没问题。但是: 我希望能够将报告映射到员工、组或部门(1:1)之一。 (该示例被简化为报告应可映射到更多不同的其他实体)。每个实体都必须驻留在自己的表中,因为不同的外部对象希望连接到数据库,并且模型不会因其他实体的常规表结构而改变 我尝试的 我尝试对每个类使用Hib

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

问题:

我的域模型由多个实体组成,这些实体彼此不继承。例如:

  • 雇员
  • 团体
  • 报告
其中:

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

就这一点而言,没问题。但是:

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

我尝试的

  • 我尝试对每个类使用Hibernate继承策略,而User、Employee和Department是从一个新的AbstractEntity子类化的,共享父类的ID和Name属性。所以用户、员工和部门仍然有自己的表。我现在可以映射报告AbstractEntity,这很有效但是:正如人们所预料的,当有超过20个左右的报告时,这会导致严重的性能问题,因为Hibernate内部必须对所有子类表进行大量连接

  • 由于表结构的更改,每个层次结构的单个表不是一个选项(请参阅问题)。此外,所有实体仅共享ID和名称作为公共属性

  • 可能的解决方案

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

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

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

    问题

    因此,我的问题是:有没有一种方法能够以某种方式捕获或拦截从数据库检索报表实体的过程,并在那里注入正确的抽象实体的加载

    或者有没有其他更优雅的方式来做我想做的事


    我正在使用Hibernate 3.6,在Java EE环境中使用不带EntityManager的注释,DAOs如中所示。

    我会采取相反的方法,将报表映射为每个类层次结构的表,并添加一个鉴别器列以确定它是员工、组还是部门报表

    我会采取相反的方法,将报表映射为每个类层次结构的一个表,并添加一个鉴别器列以确定它是员工、组还是部门报表