`
bruce008
  • 浏览: 172238 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

怎样在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 中还得专门实现一个类来搞定。   

 

 

分享到:
评论

相关推荐

    eclipselink的英文文档

    - **元数据架构**:解释了元数据在EclipseLink中的重要性和如何创建项目元数据。 - **实体映射**:介绍了如何使用注解添加元数据以及注解的优势与劣势。 - **配置基础**:讲解了默认注解值以及如何使用persistence....

    Eclipse上使用Hibernate

    本文将指导您在 Eclipse 环境中使用 Hibernate,包括下载和安装 Hibernate、配置 Hibernate、生成实体类和 DAO 类、添加映射资源等步骤。 下载和安装 Hibernate 首先,您需要下载 Hibernate 并将其添加到项目中。...

    eclipselink+jobss EAP6.2集成module

    多租户(multi-tenancy)是在JBOSS EAP和EclipseLink中处理多个独立客户或部门数据的一个重要特性。在EclipseLink中,多租户可以通过数据源隔离、共享模式或隔离模式来实现。你需要根据你的具体需求选择合适的方式,...

    离线与联网在Eclipse中安装Hibernate Tools

    在 Eclipse 中安装 Hibernate Tools 是一种非常有用的插件,该插件可以帮助我们简化 Hibernate 的开发过程,提供了一些项目向导、mapping 文件、annotation 和 JPA 等功能。下面我们将详细介绍如何在 Eclipse 中安装...

    在Eclipse中搭建hibernate项目环境步骤

    在 Eclipse 中搭建 Hibernate 项目环境步骤 在本文中,我们将详细介绍如何在 Eclipse 中搭建 Hibernate 项目环境的步骤。Hibernate 是一个流行的 Java 持久层框架,提供了对数据库的访问和操作功能。通过本文,读者...

    在eclipse中使用hibernate

    ### 在Eclipse中使用Hibernate的知识点详解 #### 1. 持久化框架产生的背景和现状 在Java开发过程中,特别是在涉及数据库交互时,由于数据库本身的特性(通常是关系型数据库),与Java语言的面向对象特性之间存在...

    精通J2EE--Eclipse、Struts、Hibernate及Spring整合应用案例全书

    在J2EE开发中,Eclipse通过插件支持对J2EE项目的创建、配置和部署,使得开发者能够高效地进行开发工作。 Struts是MVC(Model-View-Controller)架构的一个实现,它在Web应用中分离了业务逻辑、数据模型和用户界面。...

    Eclipse 在线配置 Hibernate Tools

    Eclipse 是一个广泛使用的集成开发环境(IDE),尤其在Java编程领域中,它提供了丰富的功能支持。Hibernate 是一个流行的持久化框架,用于简化数据库与Java对象之间的交互。Hibernate Tools 是一组 Eclipse 插件,...

    eclipselink

    在博文链接中,我们可以推测作者可能分享了关于如何使用 EclipseLink 实现 JPA 的经验或技术细节。Java Persistence API 是 Java SE 和 Java EE 平台上定义的标准接口,它允许开发人员将对象模型与数据库模式进行...

    eclipselink.jar

    下载eclipselink.jar,这个jar包版本2.5.2,下载eclipselink.jar

    eclipselink的crud

    在EclipseLink中创建新记录涉及到实体类的设计和`EntityManager`的使用。首先,你需要定义一个与数据库表对应的实体类,比如: ```java @Entity @Table(name = "SIMPLE_TABLE") public class SimpleEntity { @Id ...

    Eclipse快速上手Hibernate

    本教程将带你快速了解如何在Eclipse中配置和使用Hibernate。 ### 1. 安装Hibernate插件 首先,我们需要在Eclipse中安装Hibernate插件。你可以通过Eclipse的内置软件更新功能来查找并安装Hibernate相关的插件,如...

    eclipse_struts_hibernate_spring集成开发宝典 StrutsInterface.rar

    在本教程中,你将学习如何配置Eclipse以支持Struts、Hibernate和Spring的开发,包括安装相应的插件和设置项目结构。 Struts是Apache组织开发的一款MVC(模型-视图-控制器)框架,主要负责处理HTTP请求并展示用户...

    eclipselink doc文档

    eclipselink 1.0 doc 文档

    eclipse_struts_hibernate_spring集成开发宝典 blog.rar

    《Eclipse、Struts、Hibernate、Spring 集成开发宝典》是针对Java企业级应用开发的一套经典教程,其核心在于讲解如何在Eclipse环境下整合Struts、Hibernate和Spring这三个主流框架,构建高效、灵活的企业级应用程序...

    eclipse项目Hibernate实例

    【标题】"eclipse项目Hibernate实例"涉及到的是Java开发中的持久化框架Hibernate在Eclipse集成开发环境中的实际应用。Hibernate是一种流行的ORM(对象关系映射)框架,它允许开发者使用面向对象的Java语言来操作...

    利用Eclipse开发Hibernate应用程序

    在当今的IT行业中,Eclipse作为一个开源的集成开发环境(IDE),广泛应用于Java语言的开发,而Hibernate作为一个对象关系映射(ORM)框架,使Java程序员能够以面向对象的方式来操作关系型数据库。Hibernate通过映射...

    eclipse整合springMVC、Hibernate

    在IT行业中,Eclipse是一款广泛使用的Java集成开发环境(IDE),而Spring MVC和Hibernate是两个非常重要的框架,分别用于构建Web应用程序的模型-视图-控制器(MVC)架构和对象关系映射(ORM)。本篇文章将深入探讨...

    Eclipse中Hibernate简单配置和使用

    Eclipse中Hibernate简单配置和使用 Eclipse中配置和使用Hibernate框架是Java开发中常见的数据库持久化解决方案。本文将通过详细的步骤介绍Eclipse中配置和使用Hibernate框架,并提供一个简单的示例实现。 ...

Global site tag (gtag.js) - Google Analytics