EJB_JPA
码龄17年
求更新 关注
提问 私信
  • 博客:232,936
    232,936
    总访问量
  • 148
    原创
  • 48
    粉丝
  • 0
    关注
IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:中国
加入CSDN时间: 2008-04-18

个人简介:随合,希望大家能互相帮助.

查看详细资料
个人成就
  • 获得1次点赞
  • 内容获得59次评论
  • 获得6次收藏
  • 原力等级
    原力等级
    0
    原力分
    0
    本月获得
    0
创作历程
  • 148篇
    2008年
成就勋章

TA关注的专栏 0

TA关注的收藏夹 0

TA关注的社区 0

TA参与的活动 0

  • 最近
  • 文章
  • 专栏
  • 代码仓
  • 资源
  • 收藏
  • 关注/订阅/互动
更多
  • 最近

  • 文章

  • 专栏

  • 代码仓

  • 资源

  • 收藏

  • 关注/订阅/互动

  • 社区

  • 帖子

  • 问答

  • 课程

  • 视频

搜索 取消

7.5 本章小结

本章详细介绍了映射的高级应用,包括多表映射、嵌入映射以及实体的继承映射。其中实体继承映射是本章的重点,实体继承有三种策略。最后讲述了实体继承的高级部分、多态的内容。虽然在实际的项目中,本章的这些内容涉及的并不是很多,但在适合的场合也可以有选择的使用。 
原创
发布博客 2008.05.12 ·
902 阅读 ·
0 点赞 ·
2 评论 ·
0 收藏

7.7.4 继承的设计重构

进一步学习了继承的几种策略,下面对图所设计的类进行重构。重构完成后的类继承关系示意图如图所示。在进行重构是考虑这样几方面的问题:l         基类实体EmployeeEO继承自非实体类BaseEO。这样设计的好处是,可以将非持久化的一些属性和方法放到BaseEO中,这样在实体中则不必须将非持久的方法使用@Transient标注了。l         将Contract
原创
发布博客 2008.05.12 ·
1426 阅读 ·
0 点赞 ·
0 评论 ·
2 收藏

7.4.5 带继承关系的实体查询(多态)

在JPA中,实体多态(polymorphism)的使用与Java的多态相同。实体的多态是指,当查询父类的实体时,也包含其子类实体。下面以7.3.3.4小节中数据表中的数据为例,执行以下查询:                   /**查询所有的EmployeeEO实体*/                   String sql = "SELECT e FROM EmployeeE
原创
发布博客 2008.05.12 ·
2368 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

7.4.3 继承自非实体类

 实体除了可以继承自实体外,也可以继承自没有标注@Entity普通的Java类。非实体类中的属性将不被持久化,而继承它的子类中,属性也将不被持久化。例如有这样一个EmployeeEO实体类,继承自普通的Java类BaseEO,代码如下所示。BaseEO类(非实体)public class BaseEO implements Serializable {        
原创
发布博客 2008.05.12 ·
1181 阅读 ·
0 点赞 ·
1 评论 ·
0 收藏

7.4.2 继承自非映射实体类(Mapped Superclasses)

JPA规范定义了一种特殊的实体类,这种实体类在实体的多在继承时使用,该类可以不映射为指定的一个表,但该类仍可定义可持久化的属性,这些可以被它的子类继承。这类实体使用标记@MappedSuperclass注释标记。例如,将ContractEmployeeEO实体定义为非映射实体的代码,如下所示:@DiscriminatorValue("contract")@MappedSupercl
原创
发布博客 2008.05.12 ·
1588 阅读 ·
0 点赞 ·
1 评论 ·
0 收藏

7.4.1 继承自抽象(abstract)实体类

之前所讲述的实体都是标注在具体类(concrete)上,事实上,实体也可以标注在抽象类abstract上。例如,将7.3.3小节中使用的EmoloyeeEO实体改成抽象类,代码如下所示:@Entity@Table(name = "tb_employee")@Inheritance(strategy=InheritanceType. SINGLE_TABLE)@Discrim
原创
发布博客 2008.05.12 ·
1893 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

7.4 深入实体继承

类继承和多态是Java面向对象程序中重要的部分,在JPA规范中规定了对于持久化的实体也可以实现继承。
原创
发布博客 2008.05.12 ·
976 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

7.3.6 三种继承策略对比

下面这三种继承策略进行一下对比,如表所示。表  三种继承策略对比 继承策略 继承关系的实体保存在一个表(SINGLE_TABLE) 每
原创
发布博客 2008.05.12 ·
1007 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

7.3.5.4 数据表中的数据

同样执行7.3.3.4中执行创建实体的代码后,数据库中的表中的数据如图所示。另外,还有个一个生成这些表主键的表中的数据,如图所示。采用每个实体类保存在一个表继承策略,虽然是最简单、最直观的,但因为不同类分别独立的保存在不同的表中,所以在进行实体查询时,要跨越多个表进行查询,效率不高。
原创
发布博客 2008.05.12 ·
661 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

7.3.5.3 映射子类实体

下面来看一下各个子类的实体映射配置,子类实体中的属性将自动映射到改子类所对应的表中。实体RegularEmployeeEO的代码如下所示。RegularEmployeeEO实体@Entity@Table(name = "tb_regular_employee")public class RegularEmployeeEO extends EmployeeEO { 
原创
发布博客 2008.05.12 ·
702 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

7.3.5.2 映射顶层实体类

在基类使用TABLE_PER_CLASS映射时,只需要指定所映射的表和映射策略,而不需要设置@DiscriminatorColumn 和@DiscriminatorValue,以下为EmployeeEO的代码:@Entity@Table(name = "tb_employee")@Inheritance(strategy = InheritanceType.TABLE_PER_CL
原创
发布博客 2008.05.12 ·
772 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

7.3.5.1 表结构

同样是图7.3中类继承关系,采用每个实体保存为一个表的策略时,也需要创建5个表。创建表的SQL脚本如下所示。/*员工表*/CREATE TABLE  tb_employee (  id int(20) NOT NULL auto_increment,  name varchar(255) ,  PRIMARY KEY  (id));/*正式员工表*/CREATE
原创
发布博客 2008.05.12 ·
752 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

7.3.5 每个实体类保存在一个表(TABLE_PER_CLASS)

继承结构上的每个实体类,分别对应一个表。这些表中的字段与实体类所包含的属性一一映射。事实上,与一个实体映射一个表是相同的。
原创
发布博客 2008.05.12 ·
820 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

7.3.4.4 数据表中的数据

这样映射实体后,同样执行7.3.3.4中执行创建实体的代码后,数据库中的表中的数据如图所示。采用每个实体类保存在一个表的继承策略,虽然避免了表中大量null值的数据,但每个实体是通过关联来获得的。当有多个子类时,进行大量的查询会耗时很大,所以采取此策略时需要注意这些问题。 
原创
发布博客 2008.05.12 ·
729 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

7.3.4.3 映射子类实体

映射子类时除了要映射子类所对应的表外,还要映射父类表与子类表所关键的主键。例如,映射的RegularEmployeeEO实体代码如下所示:RegularEmployeeEO实体@Entity@Table(name = "tb_regular_employee")@DiscriminatorValue("regular")@PrimaryKeyJoinColumn(n
原创
发布博客 2008.05.12 ·
773 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

7.3.4.2 映射顶层实体类

在顶层的基类使用JOINED映射时,与使用SINGLE_TABLE的映射配置类似,不同的是标注的映射策略不同,以下为EmployeeEO的代码:EmployeeEO实体@Entity@Table(name = "tb_employee")@Inheritance(strategy=InheritanceType.JOINED)@DiscriminatorColumn
原创
发布博客 2008.05.12 ·
745 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

7.3.4.1 表结构

同样是图7.3中类继承关系,采用每个子类保存为一个表的策略时,需要创建5个表。创建表的SQL脚本如下所示:/*员工表*/CREATE TABLE  tb_employee (  id int(20) NOT NULL auto_increment,  name varchar(255) ,  employee_type varchar(32),  PRIMARY KEY
原创
发布博客 2008.05.12 ·
772 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

7.3.4每个实体子类保存在一个表(JOINED)

每个实体子类保存为一个表中,实际上是对SINGLE_TABLE的扩展,SINGLE_TABLE是把数据保存在一个表中,而JOINED是把一个表拆分,每个子类为一个表。所以采用此中继承策略时,每个实体都需要对应映射一个表。 
原创
发布博客 2008.05.12 ·
772 阅读 ·
0 点赞 ·
1 评论 ·
0 收藏

7.3.3.4 数据表中的数据

这样映射实体后,执行创建以下几个实体的代码:                   /** 创建EmployeeEO实体 */                   EmployeeEO employee = new EmployeeEO();                   employee.setName("Janet");                   entity
原创
发布博客 2008.05.12 ·
788 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

7.3.3.3 映射子类实体

下面来看一下各个子类的实体映射配置,实体RegularEmployeeEO的代码如下所示。RegularEmployeeEO实体@Entity@DiscriminatorValue("regular")public class RegularEmployeeEO extends EmployeeEO{          /**          * 属性id
原创
发布博客 2008.05.12 ·
772 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏
加载更多