JPA入门

JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据。他的出现主要是为了简化现有的持久化开发工作和整合ORM技术.

采用JPA的实现hibernate开发必须的包
hibernate核心包hibernate-distribution-3.3.1.GA
hibernate3.jar
lib/bytecode/cglib/hibernate-cglib-repack-2.1_3.jar
lib/required/*.jar
Hiberante注解包hibernate-annotations-3.4.0.GA
hibernate-annotations.jar
lib/ejb3-persistence.jar、hibernate-commons-annotations.jar
Hibernate针对JPA的实现包hibernate-entitymanager-3.4.0.GA
hibernate-entitymanager.jar
lib/test/log4j.jar、slf4j-log4j12.jar

JPA的配置文件

JPA规范要求在类路径的META-INF目录下放置persistence.xml,文件的名称是固定的,配置模版如下:
<?xml version="1.0"?>
<persistence 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" version="1.0">
<!-- 供应商 -->
<persistence-unit name="itcast" transaction-type="RESOURCE_LOCAL">
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value="root"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/itcast?useUnicode=true&amp;characterEncoding=UTF-8"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>

JPA事务分为 RESOURCE_LOCAL本地事务、JTA(全局事务)
J2ee环境中默认是JTA
J2se环境中默认是Resource-local

实体 bean映射
@Entity注释指明这是一个实体 Bean,
@Table 注释指定了entity所要映射的数据库表,name属性指定映射表的表名。缺省系统默认采用类名作为表名
@Column 注释定义了将成员属性映射到关系表中的哪一列和该列的一些结构信息
name:映射的列名,unique: 是否唯一,nullable: 是否允许为空,length: 对于字符型列,length列的最大字符长度
@Id 注释指定属性为表的主键
@GeneratedValue 注释定义了标识字段的生成方式
AUTO:由容器挑选一个合适的方式来保证唯一
NONE:容器不负责主键的生成,由调用程序来完成
@Temporal注释用来指定与数据库对应时间类型属性映射,默认值为:TIMESTAMP
DATE, //代表 date 类型
TIME, //代表时间类型
TIMESTAMP //代表时间戳类型
@PersistenceContext 注释指明容器在实例化SessionBean 后,动态注入EntityManager对象,如果persistence.xml文件中配置了多个不同的持久化单元。在注入EntityManager 时必须指定持久化名称,可以通过 @PersistenceContext注释的unitName属性进行指定,如果只有一个持久化内容配置,不需要明确指定
@Transient注释让一些成员属性不映射成数据库字段
@Enumerated 注释映射枚举对象到数据库
@Basic对于加了@Lob 注释的大数据类型,为了避免每次加载实体时占用大量内存,@Basic(fetch=FetchType.LAZY)延迟加载
@Lob数据字段类型为Clob和Blob类型映射

初始化
EntityManagerFactory emf = Persistence.createEntityManagerFactory("持久化单元名称");
还有另一种方法
Map configOverrides = new HashMap();//可编程配置
configOverrides.put("hibernate.hbm2ddl.auto", "create-drop");
EntityManagerFactory programmaticEmf = Persistence.createEntityManagerFactory("持久化单元名称", configOverrides);
注: 启动时,ClassLoader.getResource("META-INF/persistence.xml")

实体
@Entity
public class Employee {
age ;
setxxx();
}
每个实体必须有 ID,映射到主键

EJB3规范在被访问的元素类型上声明注解.比如方法访问,需要在getXXX上声明注解,字段级访问 就在属性上声明注解.不支持混合使用.Hibernate会通过@id/@Embeddedid的位置来判断采用哪种访问方式.

实体管理器
EntityManagerFactory emf = Persistence.createEntityManagerFactory("持久化单元名称")
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
em.xxx();
tx.commit();
em.close();
emf.close();


@TransactionAttribute注解
TransactionAttributeType.REQUIRED
TransactionAttributeType.REQUIRES_NEW
TransactionAttributeType.MANDATORY
TransactionAttributeType.NOT_SUPPORTED
TransactionAttributeType.NEVER
TransactionAttributeType.SUPPORTS

JPA的CRUD操作
EntityManager相当于 hibernate 中的 session.控制实体的生命周期.

find()或 getReference()方法根据Entity的唯一标示符来获得 Entity,find()方法不支持延迟加载,当在数据库中没有找到记录时,find()方法会返回 null。而getReference()方法支持延迟加载,当在数据库中没有找到记录时会抛出EntityNotFoundException。
em.remove(em.getReference(Person.class, 1)) 执行的 SQL (delete from Person where personid = 1)
em.remove(em.find(Person.class,1)) 执行的 SQL
select * from Person where personid = 1 delete from Person where personid = 1
em.getReference()不会真正去做数据库的 select 操作,而是把托管的 Person 实例返回出来

persist()保存 Entity到数据库
当实体正在被容器管理时,你可以调用实体的 set方法对数据进行修改,在容器决定 flush 时,更新的数据才会同步到数据库。

merge()
merge ()方法是在实体Bean 已经脱离了EntityManager 的管理时使用,当容器决定 flush 时,数据将会同步到数据库中。

remove() 把 Entity从到数据库中删除。

refresh()
如果你怀疑当前被管理的实体已经不是数据库中最新的数据,你可以通过 refresh()方法刷新实体

contains()检测实体当前是否被管理中

clear()
在处理大量实体的时候,如果你不把已经处理过的实体从 EntityManager 中分离出来,将会消耗你大量的内存。调用 EntityManager 的 clear()方法后,所有正在被管理的实体将会从持久化内容中分离出来

flush() 将实体的改变立刻刷新到数据库中

当调用 persist( ), merge( )或 remove( )这些方法时,更新并不会立刻同步到数据库中,直到容器决定刷新到数据库中时才会执行,

默认情况下,容器决定刷新是在"相关查询"执行前或事务提交时发生,当然"相关查询"除find()和 getreference()之外,这两个方法是不会引起容器触发刷新动作的,默认的刷新模式是可以改变的改变实体管理器的 Flush模式 setFlushMode()

默认情况下,实体管理器的 Flush 模式为 AUTO
FlushModeType.AUTO: 刷新在查询语句执行前(除了find()和 getreference()查询)或事务提交时才发生,使用场合:在大量更新数据的过程中没有任何查询语句(除了 find()和 getreference()查询)的执行。

FlushModeType.COMMIT:刷新只有在事务提交时才发生,在大量更新数据的过程中存在查询语句(除了find()和 getreference()查询)的执行。

上面两种模式最终反映的结果是:JDBC驱动跟数据库交互的次数。JDBC性能最大的增进是减少JDBC驱动与数据库之间的网络通讯。 FlushModeType.COMMIT 模式使更新只在一次的网络交互中完成,而FlushModeType.AUTO 模式可能需要多次交互
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值