JPA学习笔记-JPA基础

1.JPA简介:

Java持久化规范,是从EJB2.x以前的实体Bean(Entity bean)分离出来的,EJB3以后不再有实体bean,而是将实体bean放到JPA中实现。JPA是sun提出的一个对象持久化规范,各JavaEE应用服务器自主选择具体实现,JPA的设计者是hibernate框架的作者,因此Hibernate作为Jboss服务器中JPA的默认实现,Oracle的Weblogic使用EclipseLink(以前叫TopLink)作为默认的JPA实现,IBM的Websphere和Sun的Glassfish默认使用OpenJPA(Apache的一个开源项目)作为其默认的JPA实现。

JPA的底层实现是一些流行的开源ORM(对象关系映射)框架,因此JPA其实也就是java实体对象和关系型数据库建立起映射关系,通过面向对象编程的思想操作关系型数据库的规范。

2.JPA的持久化策略文件:

根据JPA规范要求,在实体bean应用中,需要在应用类路径(classpath)的META-INF目录下加入持久化配置文件——persistence.xml,该文件就是持久化策略文件。其内容如下:

[xhtml] view plain copy

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
  <persistence-unit name="持久化单元名" transaction-type="JTA">
      <jta-data-source>使用JCA部署在javaEE服务器上的数据源JNDI</jta-data-source>
        <!--指定JPA实现提供者,不指定就采用JavaEE服务器默认的JPA提供者,这里以        OpenJPA为例-->
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<class>实体bean全路径名</class>
……
    <properties>
              <!--配置JPA实现提供者的一些信息-->
    </properties>
  </persistence-unit>
</persistence>

注意:可以在持久化策略文件中配置多个持久化单元persistence-unit,在使用分布式数据库时经常配置多个持久化单元。

3.实体Bean的开发:

JPA规范中定义的实体bean开发的基本规范:

(1).在实体bean上添加”@Entity”注解,标识该bean为实体bean。

(2).实体bean必须序列化。

(3).使用”@Table(name=数据库表名)”注解,标识该实体bean映射到关系型数据库中的表名,如果不指定则JPA实现会自动生成默认的表名称。

(4).必须有一个使用”@Id”注解标识的主键,如指定自增主键的写法为:

[java] view plain copy

@Id
@Column(name=”列名”)
@GeneratedValue(Strategy=GenerationType.Auto)
private int id;

注意:@Id和@GeneratedValue两个注解必须同时使用,标识了注解之后,要主键的生成策略。

(5).Bean的其他属性使用”@Column(name=列名)”注解,指定该属性映射到数据库表中的列名,如果不指定在JPA实现会自动生成默认的列名。

(6).实体Bean必须严格遵循JavaBean的规范,提供无参的默认构造方法,属性提供set和get方法。

(7).最好重写hashcode()和equals()方法,实体bean的唯一标识是主键,因此,使用实体bean的主键来比较。

4.实体bean的主键生成策略:

实体bean的注解生成策略使用”@GeneratedValue”注解来指定主键的生成策略,默认使用Auto自增的策略,JPA不支持Hibernate的UUID主键生成策略,若要使用Hibernate的UUID做主键方式,方法如下:

(1).将Hibernate.annotation jar包加入到类路径下。

(2).在使用”@Id”的字段上同时加入如下的注解:

[java] view plain copy

@GeneratedValue(generator=”UUID主键生成策略”)
@GenericGenerator(name=” UUID主键生成策略”, strategy=”uuid”)

5.JPA开发的注意事项:

JPA支持xml方式和注解方式,目前随着注解方式越来越成熟和流行,开发JPA时候,基本都只用注解方式,因此必须在JavaEE5以上版本才行,因为以前的版本没有对注解的支持。

和xml文件相比,java注解的优缺点:

优势:

(1).描述符减少,大大提高开发效率。
(2).编译期校验,错误的注解在编译期间就会报错。

(3).注解在java代码中,从而避免了额外的文件维护工作。

(4).注解被编译成java字节码,消耗的内存小,读取速度快,往往比xml配置文件解析快几个数量级,利用测试和维护。

缺点:

(1).配置信息分散,不利于集中维护管理。

(2).改动时涉及到了程序源代码,需要找到类的源代码才可以,而且必须通过编译这一步。相比较之下xml文件可能不需要找到类源码,同时也不需要重新编译。

6.JPA注解的使用注意事项:

JPA的注解支持字段注解,也支持属性注解。

字段注解:直接在变量上加注解。

属性注解:在set/get方法上加注解。

注意:不管使用哪种注解方式,在一个实体类中,不能混用两种注解方式。

7.JPA其他的常用注解:

除了@Entity、@Id、@Table、@Column、@GeneratedValue等注解以外,JPA还有以下常用的注解:

(1).@Temporal:主要用于标注时间类型,在javax.persistence.TemporalType枚举中定义了3种时间类型:

a.DATE:等同于java.sql.Date;

b.TIME:等同于java.sql.Time;

c.TIMESTAMP:等同于java.sql.Timestamp;

(2).@Transient:实体bean中默认所有的字段都会被映射到数据库中,如果某个属性不想被映射到数据库中,则需要对其加该注解。

(3).@Lob:将属性持久化为Blob或者Clob类型,为大数据类型。

(4).@Basic:一般可以用来控制是否进行延迟加载,用法示例:

延迟加载:@Basic(fetch=FetchType.Lazy)

非延迟加载:@Basic(fetch=FetchType.EAGER)

(5).@NamedQueryies和@NamedQuery:在实体Bean上定义命名查询。

名称查询类似于jdbc中的PrepareStatement,是在数据库中预编译的查询,可以大大提高查询效率,用法如下:

[java] view plain copy

@NamedQueries({
       @NamedQuery(name=”命名查询名字”,query=JPQL查询语句),
       ……
})

(6).@OneToOne:

一对一映射注解,双向的一对一关系需要在关系维护端(owner side)的@OneToOne注解中添加mappedBy属性,建表时在关系被维护端(inverse side)建立外键指向关系维护端的主键列。

用法:@OneToOne(optional=true,casecade=CasecadeType.ALL,mappedBy=”被维护端外键”)

(7).@OneToMany:

一对多映射注解,双向一对多关系中,一端是关系维护端(owner side),只能在一端添加mapped属性。多端是关系被维护端(inverse side)。建表时在关系被维护端(多端)建立外键指向关系维护端(一端)的主键列。

用法:@OneToMany(mappedBy = “维护端(一端)主键”, cascade=CascadeType.ALL)

注意:在Hibernate中有个术语叫做维护关系反转,即由对方维护关联关系,使用inverse=false来表示关系维护放,在JPA的注解中,mappedBy就相当于inverse=false,即由mappedBy来维护关系。

(8). @ManyToOne:

多对一映射注解,在双向的一对多关系中,一端一方使用@OneToMany注解,多端的一方使用@ManyToOne注解。多对一注解用法很简单,它不用维护关系。

用法:@ManyToOne(optional = false, fetch = FetchType.EAGER)

(9).@ManyToMany:

多对多映射,采取中间表连接的映射策略,建立的中间关系表分别引入两边的主键作为外键,形成两个多对一关系。双向的多对多关系中,在关系维护端(owner side)的@ManyToMany注解中添加mappedBy属性,另一方是关系的被维护端(inverse side),关系的被维护端不能加mappedBy属性,建表时,根据两个多端的主键生成一个中间表,中间表的外键是两个多端的主键。

用法:关系维护端——>@ManyToMany(mappedBy=”另一方的关系引用属性”)

关系被维护端——>@ManyToMany(cascade=CascadeType.ALL ,fetch = FetchType.Lazy)

8.JPA的一对一关联映射:

在JPA中两个实体之间是一一对应的关系称为一对一关联关系映射,如人和身份证号关系。

(1).一对一单向关联映射:

只能从映射端查找到随关联的一方,而不能反向查找。

在关联映射方关联属性上添加@OneToOne注解。

(2).一对一双向关联映射:

可以双向查找关联关系的实体。

关系维护端:在关联属性或字段上添加@OneToOne注解,同时制定@OneToOne注解的mappedBy属性。

关系被维护端:在关联属性或字段上添加@OneToOne注解。

9.一对一关联映射两种策略:

(1).一对一主键关联:

一对一关联映射中,主键关联策略不会在两个关联实体对应的数据库表中添加外键字段,两个实体的表公用同一个主键(主键相同),其中一个实体的主键既是主键又是外键。

主键关联映射:在实体关联属性或方法上添加@OneToOne注解的同时添加@PrimaryKeyJoinColumn注解(在一对一注解关联映射的任意一端实体添加即可)。

(2).一对一唯一外键关联:

一对一关联关系映射中,唯一外键关联策略会在其中一个实体对应数据库表中添加外键字段指向另一个实体表的主键,也是一对一映射关系中最常用的映射策略。

唯一外键关联:在关联属性或字段上添加@OneToOne注解的同时添加@JoinColumn(name=”数据表列名”,unique=true)注解。

10.一对多关联映射:

在JPA中两个实体之间是一对多关系的称为一对多关联关系映射,如班级和学生关系。

(1).一对多单向关联映射:

在一对多单向关联映射中,JPA会在数据库中自动生成公有的中间表记录关联关系的情况。

在一端关联集合属性或字段上添加@OneToMany注解即可。

(2).一对多双向关联映射:

在一对多双向关联映射中,JPA不会在数据库中生成公有中间表。

在一端关联集合属性或字段上添加@OneToMany注解,同时指定其mappedBy属性。

在多端关联属性或字段上添加@ManyToOne注解。

注意:一对多关系映射中,mappedBy只能添加在OneToMany注解中,即在多端生成外键。

11.多对多关联映射:

在JPA中两个实体之间是多对多关系的称为多对多关联关系映射,如学生和教师关系。

(1).多对多单向映射:

在其中任意实体一方关联属性或字段上添加@ManyToMany注解。

(2).多对多双向映射:

关系维护端关联属性或字段上添加@ManyToMany注解,同时指定该注解的mappedBy属性。

关系被维护端关联属性或字段上添加@ManyToMany注解。

12.JPA中实体继承映射策略:

在JPA中,实体继承关系的映射策略共有三种:单表继承策略、Joined策略和Table_PER_Class策略。

(1).单表继承策略:

单表继承策略,父类实体和子类实体共用一张数据库表,在表中通过一列辨别字段来区别不同类别的实体。具体做法如下:

a.在父类实体的@Entity注解下添加如下的注解:

[java] view plain copy

@Inheritance(Strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name=”辨别字段列名”)
@DiscriminatorValue(父类实体辨别字段列值)

b.在子类实体的@Entity注解下添加如下的注解:

[java] view plain copy

@DiscriminatorValue(子类实体辨别字段列值)

(2).Joined策略:

Joined策略,父类实体和子类实体分别对应数据库中不同的表,子类实体的表中只存在其扩展的特殊属性,父类的公共属性保存在父类实体映射表中。具体做法:

只需在父类实体的@Entity注解下添加如下注解:

[java] view plain copy

@Inheritance(Strategy=InheritanceType.JOINED)

子类实体不需要特殊说明。

(3).Table_PER_Class策略:

Table_PER_Class策略,父类实体和子类实体每个类分别对应一张数据库中的表,子类表中保存所有属性,包括从父类实体中继承的属性。具体做法:

只需在父类实体的@Entity注解下添加如下注解:

[java] view plain copy

@Inheritance(Strategy=InheritanceType.TABLE_PER_CLASS)

子类实体不需要特殊说明。

*声明:虽然是2010年的,还是感谢原博主 http://blog.csdn.net/chjttony/article/details/6086298

时间: 2025-01-21 10:23:50

JPA学习笔记-JPA基础的相关文章

JPA学习笔记-JPA进阶

1.JPA的实体生命周期: JPA的实体有以下4中生命周期状态: (1).New:瞬时对象,尚未有id,还未和Persistence Context建立关联的对象. (2).Managed:持久化受管对象,有id值,已经和Persistence Context建立了关联的对象. (3).Datached:游离态离线对象,有id值,但没有和Persistence Context建立关联的对象. (4).Removed:删除的对象,有id值,尚且和Persistence Context有关联,但是已

mybatis学习笔记之基础框架(2)

mybatis学习笔记之基础框架(2) mybatis是一个持久层的框架,是apache下的顶级项目. mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成满足sql语句 mybatis可将向prparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象.(输出映射) SqlMapConfig.xml(是mybatis的全局配置文件,名称不固定) 配置了数据源/事务等mybatis运行环境 配置映射文件(配置sql语句) m

mybatis学习笔记之基础复习(3)

mybatis学习笔记之基础复习(3) mybatis是什么? mybatis是一个持久层框架,mybatis是一个不完全的ORM框架.sql语句需要程序员自己编写, 但是mybatis也是有映射(输入参数映射.输出结果映射) mybatis入门门槛不高,学习成本低,让程序员把精力放在sql语句上,对sql语句优化非常方便, 适用于需求变化较多项目,比如互联网项目. mybatis框架执行过程: 1.配置mybatis的配置文件,SqlMapConfig.xml(名称不固定) 2.通过配置文件,

那些年,我还在学asp.net(一) 学习笔记_基础应用

那些年到此,基本学习了前端的基本知识,那些年的第四课就是asp.net,当然那时看了很多教程,比如说:天轰穿,当然天轰穿说得比较多,如面向对象,C#知识,由于当时上过C++,所以就没有看这些,直接从asp.net开始,主要是学习一下asp.net用到的一些基本控件,后来感觉差不多了就不再看了,开始学习asp.net的数据教程(scott教程),那些年慢慢的走向web开发了.    先还是看一下asp.net中的一些基本的控件的使用. 一.GridView控件的使用 1.GridView 是asp

VB.Net学习笔记(基础概念和语法)

笔记|概念|语法 从基础概念和语法开始 学一门语言,特别是现在都是可视化的开发了,但我建议还是不要急着先去拖拉几个控件,而是踏踏实实的先了解一下这门语言的概念.语法和规范. VB.Net虽然和以前的VB6在语法上非常的接近,但由于现在的VB.Net是全新的面向对象的语言,所以两者还是有些区别的. 正如大家所知道的,现在VB.Net已经全面支持各种面向对象的特性了,并且还有了一些其他.Net环境所需要的特性:继承.重载.重写属性和方法.实现构造函数和析构函数.接口.委托.异常.命名空间.程序集.特

那些年,我还在学习asp.net(二) 学习笔记_基础应用

那些年,我还在学习asp.net(二) 那些年觉得看视频是很轻松的了解一个东西,但是这样的不足就是感觉太慢了,没有看书来得快,所以在有了一些了解后,还得看点书,也许书上的不一定好,但书上会把每一个应该说到的地方说到,好有个初步的认识.比如说.NET平台.组件等知识的介绍,所以,那些年就开始了asp.net方面的进一步学习. 一.学习asp.net的准备知识 正如我前面那些年所学习的,在开始之前得对它们有一定的认识: 1.  html语言的基本使用 2.  CSS+DIV的学习,撑握基本的布局 3

ios学习笔记之基础数据类型的转换_IOS

前言 前几天在做一些小功能的时候,忽然发现有的基础数据转换都忘记了,于是赶紧整理下记下来!方便自己以后查阅,也给有需要的朋友们一些参考,下面话不多说,来看详细的内容. 一.NSString 字符串拼接: NSString *string = [NSString stringWithFormat:@"%@%@",对象,对象]; 字符串与int int intString = [newString intValue]; NSString *string = [NSString string

shell学习笔记1---awk基础(原创)

awk概述 awk是一种编程语言,用于在linux/unix下对文本和数据进行处理.数据可以来自标准输入.一个或多个文件,或其它命令的输出.它支持用户自定义函数和 动态正则表达式等先进功能,是linux/unix下的一个强大编程工具.它在命令行中使用,但更多是作为脚本来使用.awk的处理文本和数据的方式是这 样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作.如果没有指定处理动作,则把匹配的行显示到标准输出 (屏幕),如果没有指定模式,则所有被操作所指

ODB学习笔记之基础环境搭建

一,简介 ODB是应用于C++的一个开源.跨平台.跨数据库的对象关系映射(ORM)系统. 它可以让你持久化C++对象到关系数据库,而不必处理表.列或者SQL,无需手动编写任何映射代码. ODB支持MySQL,SQLite,PostgreSQL,Oracle和微软SQL Server关系数据库以及C ++98/03和C ++11语言标准. 它还配备了用于Boost和Qt可选的配置文件,让你可以无缝地使用这些库持久化C++类的值类型.容器和智能指针. 它有易用性,简洁的代码,安全,数据库可移植性,优