JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

  JPA 是 JCP定义的一种规范,要使用此规范,必需配合该规范的实现,开源实现有 apache的 openjpa,还有使用更广泛的hibernate jpa实现。

  JPA是目前比较流行的一种ORM技术之一,所以他拥有ORM技术的各种特点,当然他还有自己的一些优势:

1、标准化

  JPA 是 JCP 组织发布的 Java EE 标准之一,因此任何声称符合 JPA 标准的框架都遵循同样的架构,提供相同的访问 API,这保证了基于JPA开发的企业应用能够经过少量的修改就能够在不同的JPA框架下运行。

2、对容器级特性的支持

  JPA 框架中支持大数据集、事务、并发等容器级事务,这使得 JPA 超越了简单持久化框架的局限,在企业应用发挥更大的作用。

3、简单易用,集成方便

  JPA的主要目标之一就是提供更加简单的编程模型:在JPA框架下创建实体和创建Java 类一样简单,没有任何的约束和限制,只需要使用 javax.persistence.Entity进行注释;JPA的框架和接口也都非常简单,没有太多特别的规则和设计模式的要求,开发者可以很容易的掌握。JPA基于非侵入式原则设计,因此可以很容易的和其它框架或者容器集成。

4、可媲美JDBC的查询能力

  JPA的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句,可以看成是hibernate HQL的等价物。JPA定义了独特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一种扩展,它是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的表,而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。

5、支持面向对象的高级特性

  JPA 中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,这样的支持能够让开发者最大限度的使用面向对象的模型设计企业应用,而不需要自行处理这些特性在关系数据库的持久化。

6、JPA常用注解及解释

1.设置Pojo为实体   

@Entity //标识这个pojo是一个jpa实体      

public class Users implements Serializable {      

}     

2.设置表名   

@Entity      

@Table(name = "users") //指定表名为users      

public class Users implements Serializable {      

}    

3.设置主键  

public class Users implements Serializable {      

@Id      

private String userCode;   

}  

4. 设置字段类型 

通过@Column注解设置,包含的可设置属性如下 :

.name:字段名

.unique:是否唯一

.nullable:是否可以为空

.inserttable:是否可以插入

.updateable:是否可以更新

.columnDefinition: 定义建表时创建此列的DDL

.secondaryTable: 从表名。如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字。

@Column(name = "user_code", nullable = false, length=32)//设置属性userCode对应的字段为user_code,长度为32,非空      

private String userCode;      

@Column(name = "user_wages", nullable = true, precision=12, scale=2)//设置属性wages对应的字段为user_wages,12位数字可保留两位小数,可以为空      

private double wages;      

@Temporal(TemporalType.DATE)//设置为时间类型      

private Date joinDate;      

5.字段排序 

在加载数据的时候可以为其指定顺序,使用@OrderBy注解实现

@Table(name = "USERS")      

public class User {      

  @OrderBy(name = "group_name ASC, name DESC")      

  private List books = new ArrayList();      

}     

6.主键生成策略

(1)identity主键自增,这种方式依赖于具体的数据库,如果数据库不支持自增主键,那么这个类型是没法用的

public class Users implements Serializable {      

  @Id      

  @GeneratedValue(strategy=GenerationType.IDENTITY)

  @Column(name = "user_id", nullable = false)      

  private int userId;   

}   

(2)借助一个表来实现主键自增, 通过一个表来实现主键id的自增,这种方式不依赖于具体的数据库,可以解决数据迁移的问题

public class Users implements Serializable {      

  @Id      

  @GeneratedValue(strategy=GenerationType.TABLE)     

  @Column(name = "user_code", nullable = false)      

  private String userCode;  

}       

(3)sequence主键自增,通过Sequence来实现表主键自增,这种方式依赖于数据库是否有SEQUENCE,如果没有就不能用

public class Users implements Serializable {      

  @Id      

  @GeneratedValue(strategy=GenerationType.SEQUENCE)

  @SequenceGenerator(name="seq_user")      

  @Column(name = "user_id", nullable = false)      

  private int userId;   
  
}

此外,一些实现了JPA规范的ORM映射框架,还提供了自己支持的主键生成策略,比如使用hibernate-Annotation来实现持久化映射,就可以使用Hibernate提供的UUID主键生成策略.

7.一对多双向映射关系 

有T_One和T_Many两个表,他们是一对多的关系,注解范例如下

主Pojo   

@Entity      

@Table(name = "T_ONE")      

public class One implements Serializable {      

  private static final long serialVersionUID = 1L;      

  @Id      

  @Column(name = "ONE_ID", nullable = false)      

  private String oneId;      

  @Column(name = "DESCRIPTION")
  
  private String description;   @OneToMany(cascade = CascadeType.ALL, mappedBy = "oneId")//指向多的那方的pojo的关联外键字段   private Collection<Many> manyCollection; } 

子Pojo  

@Entity      

@Table(name = "T_MANY")      

public class Many implements Serializable {      

  private static final long serialVersionUID = 1L;      

  @Id      

  @Column(name = "MANY_ID", nullable = false)      

  private String manyId;      

  @Column(name = "DESCRIPTION")      

  private String description;      

  @JoinColumn(name = "ONE_ID", referencedColumnName = "ONE_ID")//设置对应数据表的列名和引用的数据表的列名      

  @ManyToOne//设置在“一方”pojo的外键字段上      

  private One oneId;   

}

说明: 一对多双向关联跟多对一是一样的,在多端生成一个外键,不生成第三张表来管理对应关系,由外键来管理对应关系

8.多对多映射关系 

貌似多对多关系不需要设置级联,以前用hibernate的时候着实为多对多的级联头疼了一阵子,JPA的多对多还需要实际的尝试一下才能有所体会。 估计JPA的多对多也是可以转换成两个一对多的。

第一个Pojo  

@Entity      

@Table(name = "T_MANYA")      

public class ManyA implements Serializable {      

  private static final long serialVersionUID = 1L;      

  @Id      

  @Column(name = "MANYA_ID", nullable = false)      

  private String manyaId;      

  @Column(name = "DESCRIPTION")      

  private String description;      

  @ManyToMany      

  @JoinTable(name = "TMANY1_TMANY2", joinColumns = {@JoinColumn(name = "MANYA_ID", referencedColumnName = "MANYA_ID")} 

  private Collection<ManyB> manybIdCollection; 

}  

第二个Pojo   

@Entity      

@Table(name = "T_MANYB")      

public class ManyB implements Serializable {      

  private static final long serialVersionUID = 1L;      

  @Id      

  @Column(name = "MANYB_ID", nullable = false)      

  private String manybId;      

  @Column(name = "DESCRIPTION")
  
  private String description;   @ManyToMany(mappedBy = "manybIdCollection")   private Collection<ManyA> manyaIdCollection;
}

9.一对一外键映射关系 

主Pojo   

@Entity      

@Table(name = "T_ONEA")      

public class OneA implements Serializable {      

  private static final long serialVersionUID = 1L;      

  @Id      

  @Column(name = "ONEA_ID", nullable = false)      

  private String oneaId;      

  @Column(name = "DESCRIPTION")      

  private String description;      

  @OneToOne(cascade = CascadeType.ALL, mappedBy = "oneA")//主Pojo这方的设置比较简单,只要设置好级联和映射到从Pojo的外键就可以了。      

  private OneB oneB;    

}

从Pojo 

@Entity      

@Table(name = "T_ONEB")      

public class OneB implements Serializable {      

  private static final long serialVersionUID = 1L;      

  @Id      

  @Column(name = "ONEA_ID", nullable = false)      

  private String oneaId;      

  @Column(name = "DESCRIPTION")      

  private String description;      

  @JoinColumn(name = "ONEA_ID", unique=ture referencedColumnName = "ONEA_ID", insertable = false)//设置从方指向主方的关联外键,这个ONEA_ID其实是表T_ONEA的主键      

  @OneToOne      

  private OneA oneA;      

}

10.大字段   

@Lob //对应Blob字段类型      

@Column(name = "PHOTO")      

private Serializable photo;      

@Lob //对应Clob字段类型      

@Column(name = "DESCRIPTION")      

private String description;     

11.瞬时字段  :不需要与数据库映射的字段,在保存的时候不需要保存倒数据库

@Transient      

private int tempValue;

public int getTempValue(){      

get tempValue;      

}

public void setTempValue(int value){      

this.tempValue = value;      

}     

12.类的继承映射

  JPA对于具有父子关系的类,对于父类必须声明继承实体的映射策略,对于继承实体,Java.persistence.InheritanceType定义了3种映射策略(跟Hibernate类继承的映射原理相同):

SINGLE_TABLE:父子类都保存在同一个表中,通过字段值进行区分。此方法推荐使用

JOINED:父子类相同的部分保存在同一个表中,不同的部门分开存放,通过连接不同的表获取完整数据。

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

JPA规范实现的更多相关文章

  1. JavaEE(12) - JPA规范及实现(TopLink和Hibernate)

    1. JPA规范与ORM框架之间的联系 JPA规范并不属于EJB3规范,它是一套完全独立的规范,不仅可以在基于EJB的JavaEE应用程序中使用,而且完全可以在普通JavaSE应用程序中使用. JPA ...

  2. Spring Boot CRUD+分页(基于JPA规范)

    步骤一:JPA概念 JPA(Java Persistence API)是Sun官方提出的Java持久化规范,用来方便大家操作数据库. 真正干活的可能是Hibernate,TopLink等等实现了JPA ...

  3. ORM与JPA规范

    一.ORM框架 1.ORM简单介绍 对象关系映射,(Object Relational Mapping,简称ORM),是通过使用描述对象和数据库之间的映射的元数据,将面向对象语言程序中的对象自动持久化 ...

  4. JPA规范及其它持久层框架

    JPA是一种规范,而hibernate是JPA的一种实现 JPA全称为Java Persistence API ,Java持久化API是Sun公司在Java EE 5规范中提出的Java持久化接口.J ...

  5. Java Jpa 规范

    Jpa最早是EJB3.0里面的内容,JSR 220: Enterprise JavaBeansTM 3.0 https://www.jcp.org/en/jsr/detail?id=220 后来大约在 ...

  6. Hibernate4之JPA规范配置详解

    @Table Table用来定义entity主表的name,catalog,schema等属性. 属性说明: name:表名 catalog:对应关系数据库中的catalog schema:对应关系数 ...

  7. 正确使用Spring Data JPA规范

    在优锐课的学习分享中探讨了关于,Spring Data JPA的创建主要是为了通过按方法名称生成查询来轻松创建查询. 但是,有时我们需要创建复杂的查询,而无法利用查询生成器.码了很多知识笔记分享给大家 ...

  8. Spring Data-Spring整合Hibernate基于JPA规范

    JPA:由 Sun 公司提供了一对对于持久层操作的标准(接口+文档) Hibernate:是 Gavin King 开发的一套对于持久层操作的自动的 ORM 框架. Hibernate JPA:是在 ...

  9. Spring Data Jpa 规范接口表

      Keyword Sample JPQL snippet And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname ...

随机推荐

  1. Deep Q-Network 学习笔记(四)—— 改进②:double dqn

    这篇没搞懂...这里只对实现做记录. 修改的地方也只是在上一篇的基础上,在“记忆回放”函数里,计算 target Q 时取值做下调整即可. def experience_replay(self): & ...

  2. 基础拾遗----RabbitMQ

    基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...

  3. 第三节:我的第一个Java程序

    一.编写我的第一个Java程序流程: 1.新建一个文本文档:在电脑任意位置“右击”----->选择“新建”----->选择“文本文档”: 2.修改文档名与后缀名:“右击”新建的文本文档-- ...

  4. Linux CPU使用率的计算

         CPU 使用率衡量的是程序运行占用的CPU 百分比.Linux 的CPU 使用率信息可以通过/proc/stat 文件计算得到. proc 文件系统       /proc 文件系统是一个伪 ...

  5. js 数组删除元素,并获得真实长度

    前言:js数组删除一般采用数组的 splice 方法和 delete 方法,但是采用 delete 方法后直接数组.kength 来获取数组长度是获取不了真实长度的,下面详细讲解一下. 一.splic ...

  6. 关于android R.layout 中找不到已存在的布局文件问题的解决

    今天遇到一个很奇怪的问题,打R.layout.,居然不会提示已经写好的布局文件,自己把xml文件名打下去后,居然提示错误. 开始以为是R文件中没有自动生成关于布局文件对应的整型,看了R文件,其实是有生 ...

  7. LNMP下安装memcache

    转自:LNMP 添加 memcached服务 由于memcached具有更多的功能和服务,已经不推荐使用memcache了.(缺少个字母d) 1. 首先安装memcached服务端. 这里使用yum源 ...

  8. js面向对象设计之class继承

    EcmaScript 2015 (又称ES6)通过一些新的关键字,使类成为了JS中一个新的一等公民.但是目前为止,这些关于类的新关键字仅仅是建立在旧的原型系统上的语法糖,所以它们并没有带来任何的新特性 ...

  9. 葡萄城报表介绍:Java 报表

    一.Java 报表定义 Java 是一门面向对象编程语言,不仅吸收了 C++ 语言的各种优点,还摒弃了 C++ 里难以理解的多继承.指针等概念,因此 Java 语言具有功能强大和简单易用两个特征.Ja ...

  10. 多张报表导出到一个多sheet页excel

     业务需求: 通过勾选不同的报表名称,然后直接执行导出excel.并且这些报表需要统一导入到一个excel的多个sheet页中,并且对某些报表可能需要增加一些类似'已审核'之类的图片(展现时并没有 ...