【问题标题】:Can I compose a hibernate Entity?我可以编写一个休眠实体吗?
【发布时间】:2019-01-28 16:16:21
【问题描述】:

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

当前层次结构是

  • B 扩展 A 扩展 BaseClass
  • D 扩展 C 扩展 BaseClass

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

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

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

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

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    如果您使用 JPA 接口连接到 Hibernate,您可以使用 @Embedded@Embeddable,或多或少地获得您想要的。请注意,更改不会是透明的:您在哪里:

    @Entity
    public class B extends A {
        @Basic
        private int foo;
        ...
    }
    

    您在 JPQL 中使用 b.foo 引用,您将拥有:

    @Embeddable
    public classs Common {
        @Basic 
        private int foo;
        ...
    }
    
    @Entity
    public class B extends A {
        @Embedded
        private Common common;
        ...
    }
    

    您必须在 JPQL 中使用 b.common.foo 引用。

    在此处阅读有关可嵌入实体的更多信息: https://en.wikibooks.org/wiki/Java_Persistence/Embeddables

    【讨论】:

      【解决方案2】:

      您可能会使用 @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。

      【讨论】:

        猜你喜欢
        • 2011-08-08
        • 1970-01-01
        • 1970-01-01
        • 2019-03-11
        • 2021-09-27
        • 2018-10-24
        • 2023-03-17
        • 2014-12-03
        • 1970-01-01
        相关资源
        最近更新 更多