1.JPA概述
JPA(Java Persistence API)作为Java EE 5.0平台标准的ORM规范,将得到所有Java EE服务器的支持。
Sun这次吸取了之前EJB规范惨痛失败的经历,在充分吸收现有ORM框架的基础上,得到了一个易于使用、伸缩性强的ORM规范。
从目前的开发社区的反应上看,JPA受到了极大的支持和赞扬,JPA作为ORM领域标准化整合者的目标应该不难实现。
JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
Sun引入新的JPA ORM规范出于两个原因:
其一,简化现有Java EE和Java SE应用的对象持久化的开发工作;
其二,Sun希望整合对ORM技术,实现天下归一。
JPA由EJB 3.0软件专家组开发,作为JSR-220实现的一部分。
但它不囿于EJB 3.0,你可以在Web应用、甚至桌面应用中使用。
JPA的宗旨是为POJO提供持久化标准规范,由此可见,经过这几年的实践探索,能够脱离容器独立运行,方便开发和测试的理念已经深入人心了。
目前Hibernate 3.2、TopLink 10.1.3以及OpenJpa都提供了JPA的实现。
JPA的总体思想和现有Hibernate、TopLink,JDO等ORM框架大体一致。
总的来说,JPA包括以下3方面的技术:
1、ORM映射元数据,JPA支持XML和JDK 5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;
2、JPA 的API,用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。
3、查询语言,这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。
2、实体对象
访问数据库前,我们总是要设计在应用层承载数据的领域对象(Domain Object),ORM框架将它们持久化到数据库表中。
为了方便后面的讲解,我们用论坛应用为例,建立领域对象:
Topic -----(extends)----> PollTopic 1--------------*> PollOption
Topic是论坛的主题,而PollTopic是调查性质的论坛主题,扩展于Topic,一个调查主题拥有多个选项PollOption。
这三个领域对象很好地展现了领域对象之间继承和关联这两大核心的关系。这3个领域对象将被映射到数据库的两张表中:
topic_id id <pk>
topic_title varchar(100)
topic_time datetime
topic_views int
topic_type tinyint
multiple tinyint
max_choice tinyint
option_id int <pk>
topic_id int
votes int
displayorder tinyint
option varchar(80)
其中,Topic及其子类PollTopic将映射到同一张t_topic表中,并用topic_type字段区分两者。而PollOption映射到t_polloption中。
具有ORM元数据的领域对象称为实体(Entity),按JPA的规范,实体具备以下的条件:
1、必须使用javax.persistence.Entity注解或者在XML映射文件中有对应的元素;
2、必须具有一个不带参的构造函数,类不能声明为final,方法和需要持久化的属性也不能声明为final;
3、如果游离状的实体对象需要以值的方式进行传递,如通Session bean的远程业务接口传递,则必须实现Serializable接口;
4、需要持久化的属性,其访问修饰符不能是public,它们必须通过实体类方法进行访问。
3.使用注解元数据
@Entity:
将领域对象标注为一个实体,表示需要保存到数据库中,默认情况下类名即为表名,通过name属性显式指定表名,如name = "T_TOPIC",表示Topic保存到T_TOPIC表中;
@Id :
对应的属性是表的主键;
@GeneratedValue:
主键的产生策略,通过strategy属性指定。默认情况下,JPA自动选择一个最适合底层数据库的主键生成策略:
如SqlServer对应identity,MySql对应auto increment。
在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。
@Column(name = "TOPIC_ID"):
属性对应的表字段。我们并不需要指定表字段的类型,因为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 采用多种方法来支持实体继承。在父类中必须声明继承实体的映射策略。
对于继承的实体,在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:
每一个类对应自己的表,一般不推荐采用这种方式。
@DiscriminatorColumn(name = "TOPIC_TYPE", discriminatorType =DiscriminatorType.INTEGER, length = 1) ②
@DiscriminatorValue(value="1")③
关联关系
JPA规范规定任何属性都默认映射到表中,所以虽然我们没有给multiple属性提供注解信息,但JPA将按照默认的规则对该字段进行映射:字段名和属性名相同,类型相同。
如果我们不希望将某个属性持久化到数据表中,则可以通过
@Transient
注解显式指定:
@Transient
我们通过@OneToMany
指定了一个一对多的关联关系,一个PollTopic包括多个 PollOption对象(我们将在稍后的PollOption中通过ManyToOne描述PollOption和PollTopic的关系,以建立 PollTopic和PollOption的双向关联关系)。
@OneToMany(mappedBy="pollTopic",cascade=CascadeType.ALL) ④
private Set options = new HashSet();
@OneToMany
中通过mappedBy属性指定“Many”方类引用“One”方类的属性名,这里mappedBy="pollTopic"表示PollOption实体拥有一个指定PollTopic的pollTopic属性。
@ManyToOne ①
@JoinColumn(name="TOPIC_ID", nullable=false) ②
private PollTopic pollTopic;
在①处通过@ManyToOne描述了PollOption和PollTopic的多对一关联关系,并通过@JoinColumn指定关联PollTopic实体所对应表的“外键”,如②所示。
Lob字段
在JPA中Lob类型类型的持久化很简单,仅需要通过特殊的Lob注解就可以达到目的。下面,我们对Post中的Lob属性类型进行标注:
@Lob ①-1
@Basic(fetch = FetchType.EAGER) ①-2
@Column(name = "POST_TEXT", columnDefinition = "LONGTEXT NOT NULL") ①-3
private String postText;
postText属性对应T_POST表的POST_TEXT字段,该字段的类型是LONTTEXT,并且非空。
JPA 通过@Lob将属性标注为Lob类型,如①-1和②-1所示。
通过@Basic指定Lob类型数据的获取策略,FetchType.EAGER表示非延迟加载,而FetchType. LAZY表示延迟加载,如①-2和②-2所示。
通过@Column的columnDefinition属性指定数据表对应的Lob字段类型,如①-3和② -3所示。
分享到:
相关推荐
jsf基础教程+JPA教程一个简单的jsp框架。STRUS和spring,hibernet虽好,但还是以JSF,jpa为标准。
第一章:Spring Data JPA入门 包括:是什么、能干什么、有什么、HelloWorld等 第二章:JpaRepository基本功能 包括:代码示例JpaRepository提供的CRUD功能,还有翻页、排序等功能 第三章:JpaRepository的查询 ...
JPA视频_映射双向一对一的关联关系 · 16. JPA视频_映射双向多对多的关联关系 · 17. JPA视频_二级缓存 · 18. JPA视频_JPQL_HelloWorld · 19. JPA视频_JPQL_查询缓存 · 20. JPA视频_JPQL_ORDER BY 和 GROUP...
欢迎来到MyEclipse JPA教程。在这个教程里我们将体验在MyEclipse 6.5及以上版本中所包含的若干基于JPA的新特性。本教程所生成的项目文件以ZIP压缩包的格式在资源章节提供下载链接。 JPA是一个新的类似Hibernate的...
JPA2.0 一个很不错的教程,教你快速入门。
JPA(Java Persistence API)作为 ...有 ORM 框架的基础上,得到了一个易于使用、伸缩性强的 ORM 规范。从目 前的 开发社区的反应上看,JPA 受到了极大的支持和赞扬,JPA 作为 ORM 领域标准化 整合者的目标应该不难实现。
JPA作为JAVA EE5的ORM规范,将会得到所有的java服务器支持。它是一个易用,伸缩性强的框架。
JPA视频教程_使用jpa映射单个实体对象
JPA用于整合现有的ORM技术,可以简化现有Java EE和Java SE应用对象持久化的开发工作,实现ORM的统一。JPA详解视频教程 第10讲 JPA中的一对多双向关联与级联操作.avi
JPA 基础教程,适合初学者学习~~推荐~~~~~~~
默认情况下,当应用程序第一次获取实体标识时,OpenJPA 框架从数据库中一次性获取 50 个连续的实体标识缓存起来,当下一次应用程序需要获取实体标识时,OpenJPA 将首先检测缓存中是否存在实体标识,如果存在,Open...
JPA用于整合现有的ORM技术,可以简化现有Java EE和Java SE应用对象持久化的开发工作,实现ORM的统一。JPA详解视频教程 第12讲 JPA中的一对一双向关联.avi
JPA必将成为Java持久化解决方案的主流,如果你是Hibernate或者TopLink的等ORM技术的忠实用户,不管你是否情愿,你迟早也得使用JPA,那现在正好可以借助传智播客视频教程的帮助,开始学习和尝试JPA吧!
JPA用于整合现有的ORM技术,可以简化现有Java EE和Java SE应用对象持久化的开发工作,实现ORM的统一。JPA详解视频教程 第4讲 第一个JPA实例与JPA主键生成策略.avi
NULL 博文链接:https://taoistwar.iteye.com/blog/388916
EJB+JSF+JPA全JAVAEE视频教程,EJB+JSF+JPA入门觉得有点难吗?JBOSS报错?该教程全程教你学习搭建EJB+JSF+JPA框架!这是一个链接,内含一个小项目,课程设计
最近比较清闲,终于有空好好把传智的jpa视频整理了一些,因为每次复习都看视频比较麻烦,索性自己整理一份文档,方便查看。 针对jpa入门级概念做了解释; 有一些基本的增删改查例子,及测试用例; 重点学习一对多,...
JPA原名,Java Persistence API。是SUN推出的Java持久层标准。它是“官方”标准,而Hibernate只是它的一种实现,...本文档是一本关于JPA的简明使用教程,是以示例的方式进行讲解的。希望能帮到刚开始学习JPA的朋友。
这是一篇挺不错的JPA注解教程,值得收藏!