- 博客(148)
- 收藏
- 关注

原创 目录
第1章 JPA概述1.1 什么是数据持久化1.2 Java持久化技术1.2.1 序列化(Serialization)1.2.2 JDBC1.2.3 关系对象映射(ORM)1.2.4 对象数据库(ODB)1.2.5 Java数据对象(JDO)1.2.6 EJB 2.X1.3 JPA(Java Persistence API)概述1.3.1
2008-04-18 15:07:00
3900
3
原创 7.5 本章小结
本章详细介绍了映射的高级应用,包括多表映射、嵌入映射以及实体的继承映射。其中实体继承映射是本章的重点,实体继承有三种策略。最后讲述了实体继承的高级部分、多态的内容。虽然在实际的项目中,本章的这些内容涉及的并不是很多,但在适合的场合也可以有选择的使用。
2008-05-12 15:55:00
903
2
原创 7.7.4 继承的设计重构
进一步学习了继承的几种策略,下面对图所设计的类进行重构。重构完成后的类继承关系示意图如图所示。在进行重构是考虑这样几方面的问题:l 基类实体EmployeeEO继承自非实体类BaseEO。这样设计的好处是,可以将非持久化的一些属性和方法放到BaseEO中,这样在实体中则不必须将非持久的方法使用@Transient标注了。l 将Contract
2008-05-12 15:54:00
1427
原创 7.4.5 带继承关系的实体查询(多态)
在JPA中,实体多态(polymorphism)的使用与Java的多态相同。实体的多态是指,当查询父类的实体时,也包含其子类实体。下面以7.3.3.4小节中数据表中的数据为例,执行以下查询: /**查询所有的EmployeeEO实体*/ String sql = "SELECT e FROM EmployeeE
2008-05-12 15:54:00
2369
原创 7.4.3 继承自非实体类
实体除了可以继承自实体外,也可以继承自没有标注@Entity普通的Java类。非实体类中的属性将不被持久化,而继承它的子类中,属性也将不被持久化。例如有这样一个EmployeeEO实体类,继承自普通的Java类BaseEO,代码如下所示。BaseEO类(非实体)public class BaseEO implements Serializable {
2008-05-12 15:53:00
1181
1
原创 7.4.2 继承自非映射实体类(Mapped Superclasses)
JPA规范定义了一种特殊的实体类,这种实体类在实体的多在继承时使用,该类可以不映射为指定的一个表,但该类仍可定义可持久化的属性,这些可以被它的子类继承。这类实体使用标记@MappedSuperclass注释标记。例如,将ContractEmployeeEO实体定义为非映射实体的代码,如下所示:@DiscriminatorValue("contract")@MappedSupercl
2008-05-12 15:51:00
1589
1
原创 7.4.1 继承自抽象(abstract)实体类
之前所讲述的实体都是标注在具体类(concrete)上,事实上,实体也可以标注在抽象类abstract上。例如,将7.3.3小节中使用的EmoloyeeEO实体改成抽象类,代码如下所示:@Entity@Table(name = "tb_employee")@Inheritance(strategy=InheritanceType. SINGLE_TABLE)@Discrim
2008-05-12 15:50:00
1896
原创 7.3.6 三种继承策略对比
下面这三种继承策略进行一下对比,如表所示。表 三种继承策略对比 继承策略 继承关系的实体保存在一个表(SINGLE_TABLE) 每
2008-05-12 15:48:00
1009
原创 7.3.5.4 数据表中的数据
同样执行7.3.3.4中执行创建实体的代码后,数据库中的表中的数据如图所示。另外,还有个一个生成这些表主键的表中的数据,如图所示。采用每个实体类保存在一个表继承策略,虽然是最简单、最直观的,但因为不同类分别独立的保存在不同的表中,所以在进行实体查询时,要跨越多个表进行查询,效率不高。
2008-05-12 15:39:00
661
原创 7.3.5.3 映射子类实体
下面来看一下各个子类的实体映射配置,子类实体中的属性将自动映射到改子类所对应的表中。实体RegularEmployeeEO的代码如下所示。RegularEmployeeEO实体@Entity@Table(name = "tb_regular_employee")public class RegularEmployeeEO extends EmployeeEO {
2008-05-12 15:34:00
702
原创 7.3.5.2 映射顶层实体类
在基类使用TABLE_PER_CLASS映射时,只需要指定所映射的表和映射策略,而不需要设置@DiscriminatorColumn 和@DiscriminatorValue,以下为EmployeeEO的代码:@Entity@Table(name = "tb_employee")@Inheritance(strategy = InheritanceType.TABLE_PER_CL
2008-05-12 15:30:00
773
原创 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 15:25:00
754
原创 7.3.5 每个实体类保存在一个表(TABLE_PER_CLASS)
继承结构上的每个实体类,分别对应一个表。这些表中的字段与实体类所包含的属性一一映射。事实上,与一个实体映射一个表是相同的。
2008-05-12 15:23:00
821
原创 7.3.4.4 数据表中的数据
这样映射实体后,同样执行7.3.3.4中执行创建实体的代码后,数据库中的表中的数据如图所示。采用每个实体类保存在一个表的继承策略,虽然避免了表中大量null值的数据,但每个实体是通过关联来获得的。当有多个子类时,进行大量的查询会耗时很大,所以采取此策略时需要注意这些问题。
2008-05-12 15:21:00
729
原创 7.3.4.3 映射子类实体
映射子类时除了要映射子类所对应的表外,还要映射父类表与子类表所关键的主键。例如,映射的RegularEmployeeEO实体代码如下所示:RegularEmployeeEO实体@Entity@Table(name = "tb_regular_employee")@DiscriminatorValue("regular")@PrimaryKeyJoinColumn(n
2008-05-12 15:19:00
773
原创 7.3.4.2 映射顶层实体类
在顶层的基类使用JOINED映射时,与使用SINGLE_TABLE的映射配置类似,不同的是标注的映射策略不同,以下为EmployeeEO的代码:EmployeeEO实体@Entity@Table(name = "tb_employee")@Inheritance(strategy=InheritanceType.JOINED)@DiscriminatorColumn
2008-05-12 15:18:00
747
原创 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 15:17:00
772
原创 7.3.4每个实体子类保存在一个表(JOINED)
每个实体子类保存为一个表中,实际上是对SINGLE_TABLE的扩展,SINGLE_TABLE是把数据保存在一个表中,而JOINED是把一个表拆分,每个子类为一个表。所以采用此中继承策略时,每个实体都需要对应映射一个表。
2008-05-12 15:16:00
772
1
原创 7.3.3.4 数据表中的数据
这样映射实体后,执行创建以下几个实体的代码: /** 创建EmployeeEO实体 */ EmployeeEO employee = new EmployeeEO(); employee.setName("Janet"); entity
2008-05-12 15:14:00
788
原创 7.3.3.3 映射子类实体
下面来看一下各个子类的实体映射配置,实体RegularEmployeeEO的代码如下所示。RegularEmployeeEO实体@Entity@DiscriminatorValue("regular")public class RegularEmployeeEO extends EmployeeEO{ /** * 属性id
2008-05-12 15:13:00
773
原创 7.3.3.2 映射顶层的实体类
首先看一下最顶层的父类EmployeeEO,代码如下所示。EmployeeEO @Entity@Table(name = "tb_employee")/**继承映射策略*/@Inheritance(strategy=InheritanceType.SINGLE_TABLE)/**标识字段定义*/@DiscriminatorColumn(name="emp
2008-05-12 15:12:00
1117
1
原创 7.3.3.1 表结构
存在这样一个表,表中包含了图7.3中类继承关系中所有的属性字段和一个标识类别的字段。表的SQL脚本如下所示。CREATE TABLE tb_employee ( id int(20) NOT NULL auto_increment,/*员工编号*/ name varchar(255) ,/*员工名称*/ vacation_days int(10),/*年假天数*/
2008-05-12 15:11:00
650
原创 7.3.3 继承关系的实体保存在一个表(SINGLE_TABLE)
继承关系的所有实体都映射为一个表,这个表中的字段由以下两部分组成:l 类继承关系中,所有实体类的属性对应的字段。例如,RegularEmployeeEO实体和ContractEmployeeEO实体虽然处于同一个类层次上,但RegularEmployeeEO中包含vacationDays属性,ContractEmployeeEO包含createDate属性,所以表中要有两个
2008-05-12 15:10:00
692
原创 7.3.2 三种继承策略
JPA规范中规定了三种映射继承的关系策略,分别如下所示。l 继承关系的实体保存在一个表(Single Table per Class Hierarchy Strategy)继承关系的实体中,所有的实体类都映射到一个表中,表中使用一个特殊的标识字段(discriminator column),来标识一条记录属于那个子类。l 每个子类实体保存在一个表(J
2008-05-12 15:09:00
702
原创 7.3.1 类结构关系图
有这样五个实体类,它们分别是员工实体(EmployeeEO)、正式员工实体(RegularEmployeeEO)、签合同的员工实体(ContractEmployeeEO)、全职员工(FTEmployeeEO)和兼职员工(PTEmployeeEO)。它们的类继承关系如图所示。l 员工实体(EmployeeEO):所有实体类的父类,每个员工都有员工编号(id)和姓名(n
2008-05-12 15:08:00
796
原创 7.3 实体的继承策略
继承(Inheritance)是面向对象程序设计很重要的内容。JPA中规范了对实体也需要实现继承的机制。下面就讲述一下如何将带有继承关系的实体进行持久化映射。
2008-05-12 15:06:00
527
原创 7.2.4 映射属性@AttributeOverride
@AttributeOverrides由多个@AttributeOverride注释组成,每个@AttributeOverride表示属性的映射,它的定义如以下所示:@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)public @interface AttributeOverride {String name();Column
2008-05-12 15:04:00
1883
原创 7.3 实体的继承策略
继承(Inheritance)是面向对象程序设计很重要的内容。JPA中规范了对实体也需要实现继承的机制。下面就讲述一下如何将带有继承关系的实体进行持久化映射。
2008-05-12 15:04:00
662
原创 7.2.3 嵌入到实体
将Address类嵌入到实体类CustomerEO的代码如下所示: public class CustomerEO implements Serializable { private Integer id; private String name; ……getter和setter方法省略 private
2008-05-12 15:02:00
566
1
原创 7.2.2 嵌入类
以上这两个表都含有地址信息zip和line1。现在可以将这两个表中相同信息保存在一个普通的Address类中,此时Addess类的代码如以下所示:@Embeddablepublic class Address implements Serializable { /** 邮政编码 */ private String zip;
2008-05-12 15:01:00
817
原创 7.2.1 嵌入映射表结构
例如,现在有两个表tb_customer客户表和tb_contact联系人表。两个表都含有客户和联系人的地址信息,这两个表的SQL语句如下所示。--客户表CREATE TABLE tb_customer ( id int(20) NOT NULL auto_increment, name varchar(255) , customer_zip varchar(6)
2008-05-12 14:55:00
809
原创 7.1.4 多个从表注释@ SecondaryTables
当从表有两个或以上时,要使用@ SecondaryTables注释标记多个从表。该比标记定义如下所示:@Target({TYPE}) @Retention(RUNTIME)public @interface SecondaryTables {SecondaryTable[] value();}@SecondaryTables可以标记两个或多个从表,每个从表定义使用@Seco
2008-05-12 14:51:00
937
原创 7.1.3 多个表映射为一个实体
现在增加一个员工照片表“tb_employee_photo”,保存员工的照片。该表也作为员工表的另外一个从表,而不映射为实体。在这种情况下,一个员工表,有两个从表合同表和员工照片表。员工照片表的表结构的SQL语句如以下所示:CREATE TABLE tb_employee_photo ( id int(20) NOT NULL auto_increment, data b
2008-05-12 14:50:00
1015
原创 7.1.2 从表注释@ SecondaryTable
@ SecondaryTable用于定义从表,它的定义如以下代码所示:@Target({TYPE}) @Retention(RUNTIME)public @interface SecondaryTable {String name();String catalog() default "";String schema() default "";PrimaryKeyJoi
2008-05-12 14:48:00
1359
原创 7.1.1 两个表映射为一个实体
下面有以下这样一个需求,有两个表员工表(tb_employee)和合同表(tb_contatct),两个表通过员工的id(employee_id)关联。现在只需要将两个表映射为一个实体类,员工实体类。员工实体类中的属性除了员工表中的字段外,员工实体的其他的属性为对应合同表中的字段。这时,要映射的员工表叫做主表,合同表叫做从表。员工实体与员工表、合同表的结构示意图如图所示。两个表
2008-05-12 14:46:00
1229
原创 第7章 实体映射的高级应用
本章将学习实体映射的高级部分,包括多表映射、嵌入映射和实体的继承映射等。通过本章的学习,读者将能够进一步掌握各种复杂的实体映射。
2008-05-12 14:43:00
634
原创 6.9 本章小结
本章详细讲述了实体之间的关系映射,实体间的关系从数量上分主要有一对一、一对多、多对一和多对多四种,从方向上说又有单向和双向之分。掌握好这几种基本的关系映射是学习JPA中最重要的基础知识。最后通过一个完整的客户关系实体的例子,总结回顾一下各个实体间的关系如何映射。希望读者能够仔细掌握。
2008-05-12 14:42:00
622
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人