栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

根据上述文档:

如果要映射到现有数据库,并且表没有区分符列,您仍然可以使用

@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

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

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

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

@Entitypublic class Client extends Person {    @Column(name = "CLIENT_SPECIFIC")    private String clientSpecific;    // ...}@Entitypublic 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();



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/515417.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号