当前位置: 首页 > 面试题库 >

EclipseLink JPA继承(不包含鉴别符)列

夏昌胤
2023-03-14
问题内容

我有一个Client和Affiliate类,它是从Person类继承的。正在使用联接的继承策略类型-
它们中的每一个都与父类共享主键。由于没有鉴别符列,我们选择使用DescriptorCustomizer和ClassExtractor。但是它并没有真正让人们知道它是如何工作的,而且代码似乎也没有编译。如果有人给出一个带有代码片段的漂亮示例以供理解,那将是很好的。


问题答案:

根据上述文档:

如果要映射到现有数据库,并且表没有区分符列,您仍然可以使用@ClassExtractor注释或<class-extractor>元素定义继承
。类提取器采用实现ClassExtractor 接口的类。此类的实例用于确定要用于数据库行的类类型。类提取器必须定义一个
extractClassFromRow()采用数据库Record和的方法 Session

我们需要使用类提取器定义的用户注释层次结构中的根实体:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@ClassExtractor(PersonClassExtractor.class)
public abstract class Person {
    @Id @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    private String name;
    private int age;
    // ...
}

请注意,我们不使用@Customizer注释,因为在JOINED继承策略的情况下这不是必需的:

如果将类提取器与SINGLE_TABLE继承一起使用,则必须能够在查询中过滤类类型的行。这可以通过为分支类设置onlyInstancesExpression()
来实现withAllSubclassesExpression()。可以使用设置这些Expression对象DescriptorCustomizer

类提取器必须能够确定并从数据库行返回类类型。通常,我们需要替换一个鉴别符列,即

  • 列名对于给定的实体类型是唯一的
  • 基于根实体给定列的值的条件

假设层次结构中的每个继承实体类型都有一个具有唯一名称的列:

@Entity
public class Client extends Person {
    @Column(name = "CLIENT_SPECIFIC")
    private String clientSpecific;
    // ...
}

@Entity
public class Affiliate extends Person {
    @Column(name = "AFFILIATE_SPECIFIC")
    private float affiliateSpecific;
    // ...
}

那么类提取器可能如下所示:

public class PersonClassExtractor extends ClassExtractor {
    @Override
    public Class<?> extractClassFromRow(Record databaseRow, Session session) {
        if (databaseRow.containsKey("CLIENT_SPECIFIC")) {
            return Client.class;
        } else if (databaseRow.containsKey("AFFILIATE_SPECIFIC")) {
            return Affiliate.class;
        } else {
            return Person.class; // this should never happen
        }
    }
}
  • 检索客户和会员列表

    List polymorphicResults = em.createQuery(“SELECT p FROM Person p”)
    .getResultList();

  • 分别检索会员或客户列表

    List concreteResults = em.createQuery(“SELECT a FROM Affiliate a”)
    .getResultList();

    List concreteResults = em.createQuery(“SELECT c FROM Client c”)
    .getResultList();



 类似资料:
  • 我有一个奇怪的行为,JPA类层次结构使用一个表。基本上,我有两个实体EntityMap和EntityMapB,它们都扩展了EntityMaps。鉴别器值为“ENTITY_TYPE”,对于EntityMap为A,对于EntityApb为B。不知何故,我得到了EntityMapA类型的对象,其中鉴别器值设置为“B”! 我正在使用Hibernate 3.3作为JPA提供程序。 这是代码: 最后,我在En

  • 我有一个与鉴别器列连接的继承映射。 父实体: 附注。我使用的是hibernate 5.0.9.Final。

  • 问题内容: 偏重于继承而不是继承 是非常流行的短语。我读了几篇文章,最后每篇文章都说 当类之间存在纯IS-A关系时,请使用继承。 本文中的一个示例: 在 Apple 和 Fruit 之间存在明显的IS-A关系,即Apple IS-A Fruit,但作者也将其显示为Apple HAS-A Fruit(组成),以显示通过继承实现时的陷阱。 我在这里变得有些困惑,声明的含义是什么 当类之间存在纯IS-A

  • 问题内容: 我有一个简单的JOINED文件层次结构: 如您所见,所有子表所做的就是共享Documents表中的相同ID。除此之外,还会添加一列,并且不会添加任何新属性。(还要注意,在层次结构中还有两个其他具体的子表,由和表示不相关。) 这是上述表的映射: Document.java : SystemDocument.java : ExternalDocument.java : 后者应映射到Docu

  • 以此作为我的基点:https://vladmihalcea.com/the-best-way-to-map-a-many-to-many-association-with-extra-columns-when-using-jpa-and-hibernate/ 我有一个名为 Attendance 的实体,它有一个 emebedid AttendacneId,它有两列 lectureId (strin

  • FAQs in section [24]: [24.1] 如何表示“私有继承”? [24.2] 私有继承和组合(composition)有什么类似? [24.3] 我应该选谁:组合还是私有继承? [24.4] 从私有继承类到父类需要指针类型转换吗? [24.5] 保护继承和私有继承的关系是什么? [24.6] 私有继承和保护继承的访问规则是什么? 24.1 如何表示“私有继承”? 用 : priv