JPA官方文档Word文档下载推荐.docx

上传人:b****7 文档编号:22960482 上传时间:2023-02-06 格式:DOCX 页数:26 大小:268.95KB
下载 相关 举报
JPA官方文档Word文档下载推荐.docx_第1页
第1页 / 共26页
JPA官方文档Word文档下载推荐.docx_第2页
第2页 / 共26页
JPA官方文档Word文档下载推荐.docx_第3页
第3页 / 共26页
JPA官方文档Word文档下载推荐.docx_第4页
第4页 / 共26页
JPA官方文档Word文档下载推荐.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

JPA官方文档Word文档下载推荐.docx

《JPA官方文档Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《JPA官方文档Word文档下载推荐.docx(26页珍藏版)》请在冰豆网上搜索。

JPA官方文档Word文档下载推荐.docx

Topic是论坛的主题,而PollTopic是调查性质的论坛主题,它扩展于Topic,一个

调查主题拥有多个选项PollOption。

这三个领域对象很好地展现了领域对象之间继

承和关联这两大核心的关系。

这3个领域对象将被映射到数据库的两张表中:

其中,Topic及其子类PollTopic将映射到同一张t_topic表中,并用topic_type字段

区分两者。

而PollOption映射到t_polloption中。

具有ORM元数据的领域对象称为实体(Entity),按JPA的规范,实体具备以下

的条件:

必须使用javax.persistence.Entity注解或者在XML映射文件中有对应的元素;

必须具有一个不带参的构造函数,类不能声明为final,方法和需要持久化的属性

也不能声明为final;

如果游离状的实体对象需要以值的方式进行传递,如通Sessionbean的远程业务接

口传递,则必须实现Serializable接口;

需要持久化的属性,其访问修饰符不能是public,它们必须通过实体类方法进行访

问。

3.使用注解元数据

基本注解

首先,我们对Topic领域对象进行注解,使其成为一个合格的实体类:

代码清单1:

Topic实体类的注解

packagecom.baobaotao.domain;

importjavax.persistence.Column;

importjavax.persistence.DiscriminatorColumn;

importjavax.persistence.DiscriminatorType;

importjavax.persistence.DiscriminatorValue;

importjavax.persistence.Entity;

importjavax.persistence.GeneratedValue;

importjavax.persistence.GenerationType;

importjavax.persistence.Id;

importjavax.persistence.Inheritance;

importjavax.persistence.InheritanceType;

importjavax.persistence.Temporal;

importjavax.persistence.TemporalType;

@Entity(name="

T_TOPIC"

)①

publicclassTopicimplementsSerializable...{

@Id②-1

@GeneratedValue(strategy=GenerationType.TABLE)②-2

@Column(name="

TOPIC_ID"

)②-3

privateinttopicId;

TOPIC_TITLE"

length=100)③

privateStringtopicTitle;

TOPIC_TIME"

@Temporal(TemporalType.DATE)④

privateDatetopicTime;

TOPIC_VIEWS"

privateinttopicViews;

//省略get/setter方法

}

@Entity:

将领域对象标注为一个实体,表示需要保存到数据库中,默认情况下类

名即为表名,通过name属性显式指定表名,如①处的name="

,表示

Topic保存到T_TOPIC表中;

@Id:

对应的属性是表的主键,如②-1所示;

@GeneratedValue:

主键的产生策略,通过strategy属性指定。

默认情况下,JPA自

动选择一个最适合底层数据库的主键生成策略,如SqlServer对应identity,MySql

对应autoincrement。

在javax.persistence.GenerationType中定义了以下几种可供选

择的策略:

1)IDENTITY:

表自增键字段,Oracle不支持这种方式;

2)AUTO:

JPA自动选择合适的策略,是默认选项;

3)SEQUENCE:

通过序列产生主键,通过@SequenceGenerator注解指定序列名,

MySql不支持这种方式;

4)TABLE:

通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使

应用更易于数据库移植。

不同的JPA实现商生成的表名是不同的,如OpenJPA生

成openjpa_sequence_table表Hibernate生成一个hibernate_sequences表,而

TopLink则生成sequence表。

这些表都具有一个序列名和对应值两个字段,如

SEQ_NAME和SEQ_COUNT。

):

属性对应的表字段。

我们并不需要指定表字段的

类型,因为JPA会根据反射从实体属性中获取类型;

如果是字符串类型,我们可

以指定字段长度,以便可以自动生成DDL语句,如③处所示;

@Temporal(TemporalType.DATE):

如果属性是时间类型,因为数据表对时间类型

有更严格的划分,所以必须指定具体时间类型,如④所示。

javax.persistence.TemporalType枚举中定义了3种时间类型:

1)DATE:

等于java.sql.Date

2)TIME:

等于java.sql.Time

3)TIMESTAMP:

等于java.sql.Timestamp

继承关系

Topic和PollTopic是父子类,JPA采用多种方法来支持实体继承。

在父类中必须声

明继承实体的映射策略,如代码清单2所示:

代码清单2:

继承实体的映射策略

@Inheritance(strategy=

InheritanceType.SINGLE_TABLE)①

@DiscriminatorColumn(name="

TOPIC_TYPE"

discriminatorType=

DiscriminatorType.INTEGER,length=1)②

@DiscriminatorValue(value="

1"

)③

对于继承的实体,在javax.persistence.InheritanceType定义了3种映射策略:

SINGLE_TABLE:

父子类都保存到同一个表中,通过字段值进行区分。

这是我们

Topic实体所采用的策略,Topic和PollTopic都保存到同一张表中,通过

TOPIC_TYPE字段进行区分,Topic在T_TOPIC表中对应TOPIC_TYPE=1的记

录,而PollTopic对应TOPIC_TYPE=2的记录(稍后在PollTopic实体中指定);

区别的字段通过@DiscriminatorColumn说明,如②所示,区分字段对应该实体的

值通过@DiscriminatorValue指定,如③所示;

JOINED:

父子类相同的部分保存在同一个表中,不同的部分分开存放,通过表连

接获取完整数据;

TABLE_PER_CLASS:

每一个类对应自己的表,一般不推荐采用这种方式。

关联关系

我们再继续对PollTopic进行注解,进一步了解实体继承的JPA映射定义:

代码清单3:

PollTopic映射描述

@Entity

2"

publicclassPollTopicextendsTopic...{②继承于Topic实

privatebooleanmultiple;

MAX_CHOICES"

privateintmaxChoices;

@OneToMany(mappedBy="

pollTopic"

cascade=CascadeType.ALL)

privateSetoptions=newHashSet();

在①处,通过@DiscriminatorValue将区分字段TOPIC_TYPE的值为2。

由于

PollTopic实体继承于Topic实体,其它的元数据信息直接从Topic获得。

JPA规范规定任何属性都默认映射到表中,所以虽然我们没有给③处的multiple属

性提供注解信息,但JPA将按照默认的规则对该字段进行映射:

字段名和属性名

相同,类型相同。

如果我们不希望将某个属性持久化到数据表中,则可以通过

@Transient注解显式指定:

@Transient

privatebooleantempProp1;

在④处,我们通过@OneToMany指定了一个一对多的关联关系,一个PollTopic包

括多个PollOption对象(我们将在稍后的PollOption中通过ManyToOne描述

PollOption和PollTopic的关系,以建立PollTopic和PollOption的双向关联关

系)。

@OneToMany中通过mappedBy属性指定“Many”方类引用“One”方类的属性名,这

里mappedBy="

表示PollOption实体拥有一个指定PollTopic的pollTopic

属性。

下面,我们来看一下Many方PollOption实体类的映射描述:

代码清单4:

PollOption映射描述

@Entity(name="

T_POLL_OPTION"

publicclassPollOptionimplements

Serializable...{

@Id

@GeneratedValue(strategy=GenerationType.TABLE)

OPTION_ID"

privateintoptionId;

OPTION_ITEM"

privateStringoptionItem;

@ManyToOne①

@JoinColumn(name="

nullable=false)②

privatePollTopicpollTopic;

在①处通过@ManyToOne描述了PollOption和PollTopic的多对一关联关系,并通

过@JoinColumn指定关联PollTopic实体所对应表的“外键”,如②所示。

当然也可以通过@OneToOne和@ManyToMany指定一对一和多以多的关系,方法

差不多,不再赘述。

Lob字段标注大数据!

在JPA中Lob类型类型的持久化很简单,仅需要通过特殊的Lob注解就可以达到

目的。

下面,我们对Post中的Lob属性类型进行标注:

代码清单5Post:

标注Lob类型属性

importjavax.persistence.Basic;

importjavax.persistence.Lob;

T_POST"

publicclassPostimplementsSerializable...{

@Lob①-1

@Basic(fetch=FetchType.EAGER)①-2

POST_TEXT"

columnDefinition=

"

LONGTEXTNOTNULL"

)①-3

privateStringpostText;

@Lob②-1

@Basic(fetch=FetchType.LAZY)②-2

POST_ATTACH"

BLOB"

privatebyte[]postAttach;

postText属性对应T_POST表的POST_TEXT字段,该字段的类型是

LONTTEXT,并且非空。

JPA通过@Lob将属性标注为Lob类型,如①-1和②-1所

示。

通过@Basic指定Lob类型数据的获取策略,FetchType.EAGER表示非延迟加

载,而FetchType.LAZY表示延迟加载,如①-2和②-2所示。

通过@Column的

columnDefinition属性指定数据表对应的Lob字段类型,如①-3和②-3所示。

关于JPA注解的更多信息,你可以通过这篇文章进行更加深入的学习:

http:

//

annotations.html

4.使用XML元数据

除了使用注解提供元数据信息外,JPA也允许我们通过XML提供元数据信息。

条道路通罗马,路路都是安康道,开发者安全可以根据自己的习惯喜好择一而

从。

按照JPA的规范,如果你提供了XML元数据描述信息,它将覆盖实体类中的

注解元数据信息。

XML元数据信息以orm.xml命名,放置在类路径的META-INF

目录下。

JPA尽量让XML和注解的元数据在描述的结构上相近,降低学习曲线和转换难

度,所以我们在学习注解元数据后,学习XML元数据变得非常简单。

下面,我们

给出以上实体的XML描述版本,你可以对照注解的描述进行比较学习:

代码清单6XML元数据配置:

orm.xml

<

?

xmlversion="

1.0"

encoding="

UTF-8"

>

entity-mappingsxmlns="

xmlns:

xsi="

//www.w3.org/2001/XMLSchema-instance"

xsi:

schemaLocation="

version="

①实体对象所在的包

package>

com.baobaotao.domain<

/package>

entityclass="

Topic"

②Topic实体配置

tablename="

/>

attributes>

idname="

topicId"

columnname="

/>

generated-valuestrategy="

TABLE"

/id>

basicname="

topicTitle"

length="

30"

/basic>

topicTime"

temporal>

DATE<

/temporal>

topicViews"

/attributes>

/entity>

PollTopic"

②PollTopic实体配置

discriminator-value>

2<

/discriminator-value>

maxChoices"

one-to-manyname="

options"

mapped-by="

cascade>

cascade-all/>

/cascade>

/one-to-many>

PollOption"

②PollOption实体配置

optionId"

optionItem"

many-to-onename="

>

join-columnname="

nullable="

false"

/many-to-one>

Post"

②Post实体配置

postId"

POST_ID"

postText"

fetch="

EAGER"

column-definition="

LONGTEXT

NOTNULL"

lob/>

postAttach"

LAZY"

/entity-mappings>

从代码清单6中,我们可以看出PollTopic并不需要通过特殊配置指定和Topic

的继承关系,这些信息将从实体类反射信息获取。

所以从严格意义上来说,元数据

信息或XML和实体类结构信息共同构成的。

5.JPA的编程结构及重要的API

JavaEE5.0中所定义的JPA接口个数并不多,它们位于javax.persistence和

javax.persistence.spi两个包中。

javax.persistence包中大部分API都是注解类,除此之

外还包括EntityManager、Query等持久化操作接口。

而javax.persistence.spi包中的4

个API,是JPA的服务层接口。

下面,我们就来认识一下这些重要的接口。

EntityManager的类型

实体对象由实体管理器进行管理,JPA使用javax.persistence.EntityManager代表实

体管理器。

实体管理器和持久化上下文关联,持久化上下文是一系列实体的管理环

境,我们通过EntityManager和持久化上下文进行交互。

有两种类型的实体管理器:

容器型:

容器型的实体管理器由容器负责实体管理器之间的协作,在一个JTA事

务中,一个实体管理器的持久化上下文的状态会自动广播到所有使用EntityManager

的应用程序组件中。

JavaEE应用服务器提供的就是管理型的实体管理器;

应用程序型:

实体管理器的生命周期由应用程序控制,应用程序通过

javax.persistence.EntityManagerFactory的createEntityManager创建EntityManager实

例。

EntityManager的创建过程

javax.persistence.spi.PersistenceProvider接口由JPA的实现者提供,该接口由启动者

调用,以便创建一个EntityManagerFactory实例。

它定义了创建一个

EntityMan

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1