首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Eclipse开发 >

怎的在EclipseLink 中支持Hibernate 的Discriminator Formula

2012-07-22 
怎样在EclipseLink 中支持Hibernate 的DiscriminatorFormula最近在做将项目中Hibernate 的OR Mapping 转成

怎样在EclipseLink 中支持Hibernate 的Discriminator Formula

最近在做将项目中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 中还得专门实现一个类来搞定。 ??

?

?

热点排行