JPA官方文档Word文档下载推荐.docx
- 文档编号:22960482
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:26
- 大小:268.95KB
JPA官方文档Word文档下载推荐.docx
《JPA官方文档Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《JPA官方文档Word文档下载推荐.docx(26页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JPA 官方 文档
![提示](https://static.bdocx.com/images/bang_tan.gif)