JPA规范的个人理解

JPA是一种规范,而hibernateJPA的一种实现

JPA全称为JAva Persistence APIJava持久化APISun公司在Java EE 5规范中提出的java持久化接口。JPA吸取了目前Java持久化技术的优点,旨在规范、简化Java对象的持久化工作、JPA的宗旨是为POJO提供持久化标准规范。使用JPA持久化对象,并不是依赖于某一个ORM框架。

首先对ORM框架的介绍:

ORMOBJECT RELATION MAPPING)对象关系映射,面向对象的对象模型和关系型数据之间的相互转换。基于关系型数据库的数据存储,实现一个虚拟的面向对象的数据访问接口。对于这样的面向对象的接口,持久化一个面向对象就不需要再去了解关系型数据库存储的数据实现的具体细节,所以完美的解决了面向对象和关系型数据库存在互不匹配的现象。ORM通过使用描述对象和数据库之间的映射的元数据,将程序中的程序自动持久化到关系数据库中。

实现持久化的方案:

一种简单的方案是采用硬编码方式,为每一种可能的数据库库访问操作提供单独的方法,这种方案的不足:1.持久化层缺乏弹性。一旦出现业务需求的变更,就必须修改持久化层的接口。2.持久化层同时与域模型与关系数据库模型绑定,不管域模型还是关系数据库模型发生变化,就要修改持久化层的相关程序代码,增加了代码的维护难度。

ORM提供了实现持久化层的另一种模式,它采用映射元数据来描述对象关系的映射,使得ORM中间件能在任何一个应用的业务逻辑层和数据库层之间充当桥梁。Java典型的ORM中间件有:Hibernate,Mybatis 
        ORM的方法论基于三个核心原则: 
· 简单:以最基本的形式建模数据。 
· 传达性:数据库结构被任何人都能理解的语言文档化。 
· 精确性:基于数据模型创建正确标准化了的结构。 

JPA的优势:

1. 对容器的支持

JPA框架跨出了持久化框架的圈子,能够支持大数据集、事务、并发等容器级事务。

2. 方便集成

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

3. 可媲美JDBC的查询能力

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

4. 支持面向对象的高级特性

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

 

实例中使用的注释列表如下

注解

描述

@Entity

声明类为实体或表。

@Table

声明表名。

@Basic

指定非约束明确的各个字段

@Embedded

指定类或它的值是一个可嵌入的类的实例的实体属性

@Id

指定类的属性,用于识别(一个表中的主键)

@GeneratedValue

指定如何标识属性可以被初始化,例如自动、手动或从序列表中获取的值

@Transient

指定的属性,它是不持久的,即,该值永远不会存储在数据库中。

@Column

指定持久属性栏属性。

@SequenceGenerator

指定在@GeneratedValue注解中指定的属性的值。它创建了一个序列。

@TableGenerator

指定在@GeneratedValue批注指定属性的值发生器。它创造了的值生成的表。

@AccessType

这种类型的注释用于设置访问类型。如果设置@AccessTypeFIELD),然后进入FIELD明智的。如果设置@AccessTypePROPERTY),然后进入属性发生明智的。

@JoinColumn

指定一个实体组织或实体的集合。这是用在多对一和一对多关联。

@UniqueConstraint

指定的字段和用于主要或辅助表的唯一约束。

@ColumnResult

参考使用select子句的SQL查询中的列名。

@ManyToMany

定义了连接表之间的多对多一对多的关系。

@ManyToOne

定义了连接表之间的多对一的关系。

@OneToMany

定义了连接表之间存在一个一对多的关系。

@OneToOne

定义了连接表之间有一个一对一的关系。

@NamedQueries

指定命名查询的列表。

@NamedQuery

指定使用静态名称的查询。

上面注解的几个简单你的例子:

@Entity

@Table(name = "hsp_member_main")

@NamedQueries({ @NamedQuery(name = "Member.findAll", query = "SELECT m FROM Member m") })

public class Member implements Serializable {

private static final long serialVersionUID = 1L;

@Id

    @Basic(optional = false)

    @NotNull

    @Size(min = 1, max = 32)

    @Column(name = "member_id")

    private String memberId;

    @Size(max = 50)

    @Column(name = "member_name")

private String name;

 

JPAHibernate的关系

1. Hibernate

  JPA是需要Provider来实现其功能的,Hibernate就是JPA Provider中很强的一个。从功能上来说,JPA现在就是Hibernate功能的一个子集。Hibernate 3.2开始,就开始兼容JPAHibernate3.2获得了Sun TCK JPA(Java  Persistence API) 兼容认证。

  例如: 

  (1)实体对象的状态,在Hibernate有自由、持久、游离三种,JPA里有newmanageddetachedremoved,而这些状态都是一一对应的。

  (2)flush方法,都是对应的,

  (3)Query query = manager.createQuery(sql),它在Hibernate里写法上是session,而在JPA中变成了  manager

 

2.  JPAHibernate之间的关系,可以简单的理解为JPA是标准接口,Hibernate是实现。

  那么Hibernate是如何实现与JPA 的这种关系的呢?

  Hibernate主要是通过三个组件来实现的,及hibernate-annotationhibernate-entitymanagerhibernate-core

  (1)hibernate-annotationHibernate支持annotation方式配置的基础,它包括了标准的JPA annotation以及  Hibernate自身特殊功能的annotation

  (2)hibernate-coreHibernate的核心实现,提供了Hibernate所有的核心功能。

  (3)hibernate-entitymanager实现了标准的JPA,可以把它看成hibernate-coreJPA之间的适配器,它并不直接提供ORM的功能,而是对hibernate-core进行封装,使得Hibernate符合JPA的规范。

 

  总的来说,JPA是规范,Hibernate是框架,JPA是持久化规范,而Hibernate实现了JPA

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nifengzhuizhao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值