最近在做将项目中Hibernate 的OR Mapping 转成 JPA 的 EclipseLink 实现。 在Hibernate 中, 如果我们需要多种类型 mapping 到 一张单表的时候, 我们需要配置这个 discriminator 元素。 这个又分为两种情形, 如果在这个表中 我们有一个字段来区分不同的类型的时候, 配置 discriminator 元素的时候就比较简单了。我们指定字段名即可, 如下:
<discriminator column="TYPE_CD"
type="java.lang.String" insert="false" />
然后我们需要在各个类型上 使用属性 discriminator-value 来指定它们各自用来区别的值。
另外一种情形是如果我们没有一个固定的字段来区分, 我们需要在discriminator 元素中配置 formula 公式, 比如:
<discriminator type="java.lang.String"
formula="case
when DRUG_LIST_TYPE_ID = 4 then 'A'
when DRUG_LIST_TYPE_ID = 8 then 'B'
when DRUG_LIST_TYPE_ID = 9 then 'C'
when DRUG_LIST_TYPE_ID = 15 then 'MESSAGE'
else 'BASE'
end" />
第一种情形在 JPA 中还是很简单的 在实体基类定义前面加上
@Entity
@Table(name = "Entry")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="TYPE_CD", discriminatorType=DiscriminatorType.STRING,length=20)
@DiscriminatorValue("BASE")
public class EntryCMP {
然后子类前面加上 不同的
@DiscriminatorValue("BLABLA")
但是像前面的第二种情形,没有固定的字段的时候, 我们在EclipseLink 中采用 annotation 又怎么配置呢。 在它的官方wiki 中发现一个 ClassExtractor 的annoatation , 我们可以这样来定义 基类 :
@Entity
@Table(name = "Entry")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@ClassExtractor(EntryClassExtractor.class)
public class EntryCMP {
然后再单独定义一个ClassExtractor 类 , 在这个类中来实现对应于Hibernate 的formula 的逻辑:
package com.bwang.test.domain.cmp;
import org.eclipse.persistence.descriptors.ClassExtractor;
import org.eclipse.persistence.sessions.Record;
import org.eclipse.persistence.sessions.Session;
public class EntryClassExtractor extends ClassExtractor {
public Class extractClassFromRow (Record row, Session session) {
Long typeId = (Long) row.get("TYPE_ID");
if (typeId != null) {
if (typeId.equals(4L)) {
return EntryTierCMP.class;
}
if (typeId.equals(9L)) {
return EntryMacCMP.class;
}
if (typeId.equals(8L)) {
return EntryDrugSourceCMP.class;
}
if (typeId.equals(15L)) {
return EntryMessageCMP.class;
}
}
return EntryCMP.class;
}
}
可以看到这个ClassExtractor 是EclipseLink 自家的实现, 我在 JPA 2 specification 中是没有找到的。
当然对于基类和子类都不要再指定那个 @DiscriminatorValue 了。
比较 Hibernate 和JPA 的实现 , 感觉还是 Hibernate 这块的定义比较强, 在xml 很简单就搞定, 在JPA 中还得专门实现一个类来搞定。
分享到:
相关推荐
python教程学习
tdac034.pdf
veclibm111111111111
nssm工具,进行2次解压后即可
视讯镜头优化,操作不走
【数据结构】的资源,包括书籍、在线课程和网站
北京大学-DeepSeek系列-提示词工程和落地场景.pdf.png
【财信国际经济研究院-2025研报】2025年2月CPI和PPI数据点评:通胀低于预期,内需亟待提振.pdf
【毕业设计】java-springboot+vue精品在线试题库系统源码(完整前后端+mysql+说明文档+LunW).zip
python安装-25.求 a 的 b 次方——有点不好意思哈.py
代码实现了自适应IMM(交互式多模型)算法,专注于对目标状态进行估计,并结合了匀速(CV)和匀加速(CA)运动模型。它使用自适应观测噪声估计和扩展卡尔曼滤波器(EKF)作为滤波主体,并在最后提供误差统计特性输出。
中产品工业物联网联网的基础功能,是企业开启数字化转型的入门之选。它能帮助企业快速搭建起基础的设备数据采集与监控体系,以较低成本实
北京大学DeepSeek系列-DeepSeek与AIGC应用.pdf.png
【毕业设计-java】springboot-vue基于多维分类的知识管理系统实现源码(完整前后端+mysql+说明文档+LunW).zip
## 一、数据介绍 本数据参考C刊《管理评论》佟岩(2024)老师的做法,使用各年度省级政府工作报告中“减碳”关键词的词频总数来测度地方政府对“减碳”的重视程度,“减碳”关键词包括二氧化碳、低碳、减排、节能、能耗、环境保护(环保)、生态、绿色。 本数据包含:原始数据、参考文献、代码do文件、最终结果。 ## 二、参考文献: 佟岩,李鑫,徐国铨.企业集团碳减排压力与债务分布-来自高耗能上市公司的经验证据[J].管理评论,2024,36(02):210-221.DOI:10.14120/j.cnki.cn11-5057/f.2024.02.014 ## 三、相关数据:城市、城市编码、年份、减碳重视程度词频。
python教程学习
jfinal-undertow 用于开发、部署由 jfinal 开发的 web 项目
python学习一些项目和资源
锐捷设备命令最全大合集
uniapp-machine-learning-from-scratch-05.rar