使用JPA持久化对象的步骤
《1》创建persistence.xml,在这个文件中配置持久化单元(Hibernate中的hibernate.cfg.xml);
A、需要指定跟哪个数据库进行交互;
B、需要指定JPA使用哪个持久化框架(因为JPA本身没有持久化的能力);
《2》创建EntityManagerFactory(Hibernate中的SessionFactoyr);
《3》创建EntityManager 实体管理器(Hibernate中的Session);
《4》创建实体类,使用annotation来描述实体类跟数据库表之间的一一映射关系;
《5》使用JPA API 完成增删改查操作。
其主要创建执行过程如下:
persistence.xml --》 persistence --》 EntityManagerFactory --》 EntityManager --》 Transaction --》 find/merge/remove/persist --》 em.getTransaction.commit()/em.close();
【persistence.xml】
<persistence-unit name="AdderssBookPU" transaction-type="RESOURCE_LOCAL"> // 持久化单元名称
<provider>oracle.toplink.essentials.PersisteneProvider</provider> // Provider名称
<class>addressbook.Address</class> // 需要持久化的类,可以有多个
<class>addressbook.Person</class>
<properties>
<property name="toplink.jdbc.user" value="sa"/>
<property name="toplink.jdbc.password" value="sa"/>
<property name="toplink.jdbc.url" value="jdbc:microsoft:sqlserver//localhost:1433;DatabaseName=zf"/> // 配置数据库连接
<property name="toplink.jdbc.driver" value="jdbc:microsoft.jdbc.sqlserver.SQLServerDriver"/> // 数据库驱动
<property name="toplink.ddl-generation" value="drop-and-create-tables"/> // 运行时先删除,再创建表
......
一、persitence-unit : 持久化单元
一个持久化单元可以创建一个EntityManagerFactory
# 数据库相关的信息
# 持久化提供者的信息
# 厂商的一些客户化属性 <property name="hibernate.show_sql" value="true"/>
# 其它一些可选的元数据
如果使用不用的持久化提供程序,那么需要指定提供程序类
附加的ORM映射文件
附加实体的JAR文件
二、Persistence Provider : 持久化提供者
# JPA只是一套标准的持久化API,它需要通过一个ORM框架,才能进行持久化,我们把这个能和JPA集成起来的ORM框架称为持久化的提供者;
# 每一个支持EBJ3.0 JPA 的 ORM框架必须提供一个实现javax.persistence.spi.PersistenceProvider接口的实现类,通过它创建EntityManager对象
三、使用JPA的6个基本步骤
1、创建EntityManagerFactory --》 2、创建EntityManager --》 3、开始一个事务getTransaction.begin() --》
4、持久化操作merge / persist / remove / find --》 5、提交事务getTransaction.commit() --》 6、关闭EntityManager
四、EntityManagerFactory :实体管理器工厂
# 实体管理器的工厂,类似于Hibernate中的SessionFactory
# 通过持久化提供者Persistence Provider创建这个对象应用程序管理
# 用来创建EntityManager实例
# 一个数据库创建一个EntityManagerFactory对象
五、EntityManager :实体管理器
# 实体管理器,类似于Hibernate的Session
# 由EntityManagerFactory创建
# 用来访问持久化上下文中实体对象的一个接口,管理实体对象与底层数据源之间进行O/R映射,包括增删改查
# 一个线程一个EntityManager对象
其中,获取EntityManager对象的方式有一下两种:
《1》应用程序管理EntityManager
应用程序通过javax.persistence.EntityManagerFactory的createEntityManager创建EntityManager实例;
《2》容器管理EntityManager
通过依赖注入获取,如:@Stateless
public class HRAgentBean implements HRAgenRemote{
@PersistenceContext(unitName="salesemployee")
private EntityManager manager;
六、Persistence Context :持久化上下文
# 其实就是JPA的一级缓存
# 是一系列实体的管理环境,实体对象集合
# 被EntityManager管理着的,通过EntityManager和持久化上下文进行交互
# 持久化上下文类型:
《1》应用程序管理:
应用程序来管理所需资源
持久化上下文是绑定到当前EntityManager
《2》容器管理,又分为两种:
A、和事务范围相关持久化上下文
事务启动就会创建,事务结束也会结束;
在无状态session bean中使用;
B、扩展的持久化上下文
和有状态session bean结合使用,它的生命周期和事务无关;
当Session bean对象创建,持久化上下文就创建,当Session bean对象销毁,持久化上下文就结束。
【代码示例】
public class JPAJUnitTest{
private static EntityManagerFactory emf;
private Person p;
private Address a;
@BeforeClass
public static void setUpClass() throws Exception{
// 1、创建EntityManagerFactory
emf = Persistence.createEntityManagerFactory("AddressBookPU");
}
@Test
public void createPersons() throws Exception{
add(p);
}
public static void add(Object object){
// 2、创建EntityManager
javax.persistence.EntityManager em = emf.createEntityManager();
// 3、开始事务
em.getTransaction().begin();
try{
// 4、持久化操作
em.persist(object);
// 5、提交事务
em.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
em.getTransaction().rollback();
}finally{
// 6、关闭EntityManager
em.close();
}
......
}
}