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. mongodb int型id 自增

    mongo的c#客户端提供了接口IIdGenerator,有guid和objectid等几种实现,但没有int型id的实现 接口主要2个方法,一个IsEmpty返回bool,判断当前id值是否是空(估 ...

  2. 【手记】解决VS2010宏功能报错

    抱歉问题解决前没留截图,总之就是使用宏相关的功能都打不开,会弹窗报错,英文,大意是[一个或多个组件不存在,请尝试重装]. 尝试过: 修复安装VS2010 按此文照做:https://visualstu ...

  3. Bootstrap中的datetimepicker插件用法总结(转载)

    datetimepicker用法总结   目录 datetimepicker用法总结 目录 简述 官方文档 选项属性 1 format 格式 2 weekStart 一周从哪一天开始 3 startD ...

  4. [转]C# 关闭嵌在程序中的word进程而不关闭用户通过word手动打开的word进程

    命名空间 :System.Diagnostics 以前在word的时候,经常碰到word进程产生一大堆,怕关错了,把用户自己打开的word也关闭,一直搞忽悠,今天上网花了10块钱,下了个文件,给我了一 ...

  5. java 获取控制台输入

    读取控制台输入 从控制台读取一行数据,返回值字符串 public class IO { public static void main(String args[]) throws IOExceptio ...

  6. C# base64 和图片互转

    C# imgage图片转base64字符/base64字符串转图片另存成 //图片转为base64编码的字符串 protected string ImgToBase64String(string Im ...

  7. MangoDB的C#驱动库(.net framewokr 4.0)

    编写运维工具,需要联接MangoDB 基于我陈旧的技术栈,就用c#开发了 驱动库下载地址记录到至此,需要的可以下载 注意,此驱动是老版本的,只支持.net framewokr 4.0 看了半天,觉得够 ...

  8. 统计SQL Server所有表记录数

    SELECT SCHEMA_NAME(t.schema_id) AS [schema] ,t.name AS tableName ,i.rows AS [rowCount] FROM sys.tabl ...

  9. MySQL内连接和外连接

    INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录. LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录. RIGHT JOIN(右连接): 与 LEF ...

  10. [js常用]将秒转化为时分秒

    内容引入至网络 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" ...