首页 > 解决方案 > 我可以编写一个休眠实体吗?

问题描述

我最近继承了一个项目,其中有 2 个共享许多公共字段的表。我是休眠新手,想知道是否可以使用组合来生成表而不是继承?B 和 D 基本上是同一个类,但表名不同。

当前层次结构是

我目前的问题是许多其他类扩展了没有共享字段的 BaseClass,并且 2 个子类不共享一个共同的父类,因此我无法在层次结构中添加另一个级别并使用 @MappedSuperclass。

因此,我想知道我是否可以将我的公共字段分组到一个类中,并以某种方式将我的子类与这个新类组成?

为神秘的名字道歉,但一如既往;保密...

编辑 - 发现与@Embeddable 类似的东西https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/chapters/domain/embeddables.html

标签: javahibernate

解决方案


您可能会使用 @Embedded 并为 B 和 D 嵌入相同的对象,可能类似于:

@Embeddable
public class CommonFieldObject {
  @Column(name="COMFIELD1")
  private String commonField1;

  @Column(name="COMFIELD2")
  private String commonField2;

  ...
}



@Table
public class C extends A {
  @Embedded
  @AttributeOverrides({
    @AttributeOverride(name="commonField1", column=@Column(name="CFO_COMFIELD1")),
    @AttributeOverride(name="commonField2", column=@Column(name="CFO_COMFIELD2"))
  })
  private CommonFieldObject commonFieldObj; //CFO_ prefix for this reference - in case we have a second field referencing a CommonFieldObject - use a different prefix..

  ...
}

然后,您应该在表中获取列 CFO_COMFIELD1 和 CFO_COMFIELD2,并且可以为 D 类回收 CommonFieldObject。


推荐阅读