一、Persistence

Persistence 类用于获取 EntityManagerFactory 实例,该类包含一个 createEntityManagerFactory 的静态方法 。createEntityManagerFactory 方法有两个重载。

// persistence.xml 的持久化单元名
String persistenceUnitName = "jpaname";
/**
* 带有一个参数的方法:以 JPA 配置文件 persistence.xml 中的持久化单元名为参数
*/
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitName);
// persistence.xml 的持久化单元名
String persistenceUnitName = "jpaname"; Map<String, Object> properites = new HashMap<String, Object>(10);
properites.put("hibernate.show_sql", true); /**
* 带有两个参数的方法:后一个参数 Map类型,用于设置 JPA 的相关属性,这时将忽略其它地方设置的属性,Map 对象的属性名必须是 JPA 实现库提供商的名字空间约定的属性名
*/
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitName, properites);

二、EntityManagerFactory

/**
* EntityManagerFactory 接口主要用来创建 EntityManager 实例。
* createEntityManager():用于创建实体管理器对象实例。
* createEntityManager(Map map):用于创建实体管理器对象实例的重载方法,Map 参数用于提供 EntityManager 的属性
* isOpen():检查 EntityManagerFactory 是否处于打开状态。实体管理器工厂创建后一直处于打开状态,除非调用close()方法将其关闭
* close():关闭 EntityManagerFactory。EntityManagerFactory 关闭后将释放所有资源,isOpen()方法测试将返回 false,其它方法将不能调用,否则将导致IllegalStateException异常
*/ // 创建 EntityManager. 类似于 Hibernate 的 SessionFactory
EntityManager entityManager = entityManagerFactory.createEntityManager();

三、EntityTransaction

EntityTransaction 接口用来管理资源层实体管理器的事务操作。通过调用实体管理器的getTransaction方法 获得其实例。

/**
* begin ()
* 用于启动一个事务,此后的多个数据库操作将作为整体被提交或撤消。若这时事务已启动则会抛出 IllegalStateException 异常。
* commit ()
* 用于提交当前事务。即将事务启动以后的所有数据库更新操作持久化至数据库中。
* rollback ()
* 撤消(回滚)当前事务。即撤消事务启动后的所有数据库更新操作,从而不对数据库产生影响。
* setRollbackOnly ()
* 使当前事务只能被撤消。
* getRollbackOnly ()
* 查看当前事务是否设置了只能撤消标志。
* isActive ()
* 查看当前事务是否是活动的。如果返回true则不能调用begin方法,否则将抛出 IllegalStateException 异常;
* 如果返回 false 则不能调用 commit、rollback、setRollbackOnly 及 getRollbackOnly 方法,否则将抛出 IllegalStateException 异常。
*/

四、EntityManager

在 JPA 规范中,EntityManager 是完成持久化操作的核心对象。

实体作为普通 Java 对象,只有在调用 EntityManager 将其持久化后才会变成持久化对象。

EntityManager 对象在一组实体类与底层数据源之间进行 O/R 映射的管理,它可以用来管理和更新 Entity Bean,根椐主键查找 Entity Bean,还可以通过JPQL语句查询实体。

4.1.EntityManager#find

package jpa.test;

import com.jpa.entity.Customer;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence; public class JPATest { private EntityManagerFactory entityManagerFactory;
private EntityManager entityManager;
private EntityTransaction transaction; @Before
public void init(){
entityManagerFactory = Persistence.createEntityManagerFactory("jpaname");
entityManager = entityManagerFactory.createEntityManager();
transaction = entityManager.getTransaction();
transaction.begin();
} @After
public void destroy(){
transaction.commit();
entityManager.close();
entityManagerFactory.close();
} // 类似于 hibernate 中 Session 的 get 方法.
@Test
public void testFind() {
Customer customer = entityManager.find(Customer.class, 1);
System.out.println("-------------------------------------");
System.out.println(customer);
}
}

4.2.EntityManager#getReference

// 类似于 hibernate 中 Session 的 load 方法
@Test
public void testGetReference(){
Customer customer = entityManager.getReference(Customer.class, 1);
System.out.println(customer.getClass().getName());
System.out.println("-------------------------------------");
System.out.println(customer);
}

 

// 在使用之前关闭 EntityManager,会发生懒加载异常
@Test
public void testGetReference(){
Customer customer = entityManager.getReference(Customer.class, 1);
System.out.println(customer.getClass().getName());
System.out.println("-------------------------------------");
transaction.commit();
entityManager.close();
System.out.println(customer);
}

实体类的几种状态:

新建状态:新创建的对象,尚未拥有持久性主键。

持久化状态:已经拥有持久性主键并和持久化建立了上下文环境。

游离状态:拥有持久化主键,但是没有与持久化建立上下文环境。

删除状态:拥有持久化主键,已经和持久化建立上下文环境,但是从数据库中删除。

4.3.EntityManager#persistence

// 类似于 hibernate 的 save 方法. 使对象由临时状态变为持久化状态
// 和 hibernate 的 save 方法的不同之处: 若对象有 id, 则不能执行 insert 操作, 会抛出异常
@Test
public void testPersistence(){
Customer customer = new Customer();
customer.setAge(15);
customer.setBirth(new Date());
customer.setCreatedTime(new Date());
customer.setEmail("bb@163.com");
customer.setLastName("BB"); //customer.setId(100); entityManager.persist(customer); System.out.println(customer.getId());
}
 

4.4.EntityManager#remove

// 类似于 hibernate 中 Session 的 delete 方法,把对象对应的记录从数据库中移除
// 该方法只能移除 持久化 对象,而 hibernate 的 delete 方法实际上还可以移除 游离对象
@Test
public void testRemove(){
// Customer customer = new Customer();
// customer.setId(2); Customer customer = entityManager.find(Customer.class, 2);
entityManager.remove(customer);
}

4.5.EntityManager 其他方法

/**
* flush ():同步持久上下文环境,即将持久上下文环境的所有未保存实体的状态信息保存到数据库中。
* setFlushMode (FlushModeType flushMode):设置持久上下文环境的Flush模式。参数可以取2个枚举
* FlushModeType.AUTO 为自动更新数据库实体。
* FlushModeType.COMMIT 为直到提交事务时才更新数据库记录。
* getFlushMode ():获取持久上下文环境的Flush模式。返回FlushModeType类的枚举值。
* refresh (Object entity):用数据库实体记录的值更新实体对象的状态,即更新实例的属性值。
* clear ():清除持久上下文环境,断开所有关联的实体。如果这时还有未提交的更新则会被撤消。
* contains (Object entity):判断一个实例是否属于当前持久上下文环境管理的实体。
* isOpen ():判断当前的实体管理器是否是打开状态。
* getTransaction ():返回资源层的事务对象。EntityTransaction实例可以用于开始和提交多个事务。
* close ():关闭实体管理器。之后若调用实体管理器实例的方法或其派生的查询对象的方法都将抛出 IllegalstateException 异常,除了getTransaction 和 isOpen方法(返回 false)。
* 不过,当与实体管理器关联的事务处于活动状态时,调用 close 方法后持久上下文将仍处于被管理状态,直到事务完成。
*/

官方API文档

3、JPA-API的更多相关文章

  1. JPA API与注解

    一.JPA API Persistence 类:用于获取 EntityManagerFactory 实例,该类含有静态方法 createEntityManagerFactory. //persiste ...

  2. 4、JPA table主键生成策略(在JPA中table策略是首推!!!)

    用 table 来生成主键详解 它是在不影响性能情况下,通用性最强的 JPA 主键生成器.这种方法生成主键的策略可以适用于任何数据库,不必担心不同数据库不兼容造成的问题. initialValue不起 ...

  3. 3、JPA一些常用的注解

    常用注解有下面这些: ①:@Entity.@Table.@Id.@GeneratedValue.@Column.@Basic ②:@Transient 用于忽略某个属性,而不对该属性进行持久化操作 ③ ...

  4. 转:spring data jpa、 hibernate、 jpa 三者之间的关系

    原文链接:spring data jpa. hibernate. jpa 三者之间的关系 spring data jpa hibernate jpa 三者之间的关系 JPA规范与ORM框架之间的关系是 ...

  5. spring data jpa、 hibernate、 jpa 三者之间的关系

    http://www.cnblogs.com/xiaoheike/p/5150553.html JPA规范与ORM框架之间的关系是怎样的呢? JPA规范本质上就是一种ORM规范,注意不是ORM框架-- ...

  6. SpringData Jpa、Hibernate、Jpa 三者之间的关系

    JPA规范与ORM框架之间的关系是怎样的呢? JPA规范本质上就是一种ORM规范,注意不是ORM框架--因为JPA并未提供ORM实现,它只是制订了一些规范,提供了一些编程的API接口,但具体实现则由服 ...

  7. 【Spring Data 系列学习】了解 Spring Data JPA 、 Jpa 和 Hibernate

    在开始学习 Spring Data JPA 之前,首先讨论下 Spring Data Jpa.JPA 和 Hibernate 之前的关系. JPA JPA 是 Java Persistence API ...

  8. Web jquery表格组件 JQGrid 的使用 - 4.JQGrid参数、ColModel API、事件及方法

    系列索引 Web jquery表格组件 JQGrid 的使用 - 从入门到精通 开篇及索引 Web jquery表格组件 JQGrid 的使用 - 4.JQGrid参数.ColModel API.事件 ...

  9. WCF 、Web API 、 WCF REST 和 Web Service 的区别

    WCF .Web API . WCF REST 和 Web Service 的区别 The .Net framework has a number of technologies that allow ...

  10. python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API

    python  Django教程  之 模型(数据库).自定义Field.数据表更改.QuerySet API 一.Django 模型(数据库) Django 模型是与数据库相关的,与数据库相关的代码 ...

随机推荐

  1. QTableWidget控件总结&lt;一&gt;

    [1]QTableWidget简介 QTableWidget是QT对话框设计中常用的显示数据表格的控件. 学习QTableWidget就要首先看看QTableView控件(控件也是有"家世& ...

  2. [SVN Mac的SVN使用]

    在Windows环境中,我们一般使用TortoiseSVN来搭建svn环境.在Mac环境下,由于Mac自带了svn的服务器端和客户端功能,所以我们可以在不装任何第三方软件的前提下使用svn功能,不过还 ...

  3. 【转】websocket协议规范

    在线版目录: 1.引言——WebSocket协议翻译 2.一致性要求——WebSocket协议翻译 3.WebSocket URI——WebSocket协议翻译 4.打开阶段握手——WebSocket ...

  4. addChildViewController相关api深入剖析

    注:本文根据个人的实践和理解写成,若有不当之处欢迎斧正和探讨! addChildViewController是一个从iOS5开始支持的api接口,相关的一系列的接口是用来处理viewcontrolle ...

  5. POJ 1988 Cube Stacking

    题意:有编号为1~N的N个小木块,有两种操作 M x y 将木块x所在的堆放到木块y所在的堆的上面 C x 询问木块x下面有多少块木块 代码巧妙就巧妙在GetParent函数中在进行路径压缩的同时,也 ...

  6. android 多项对话框

    在main.xml中 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:a ...

  7. 深入理解Autofac生命周期

    为什么Autofac表现的这样? 这里似乎有几个陷阱,虽然这里只有一个------并且这个值得重申: Autofac将会跟踪每一个他所创建的可销毁的组件实例,无论这个实例是怎样被获取的. 当然,最终. ...

  8. Thread类源码剖析

    目录 1.引子 2.JVM线程状态 3.Thread常用方法 4.拓展点 一.引子 说来也有些汗颜,搞了几年java,忽然发现竟然没拜读过java.lang.Thread类源码,这次特地拿出来晒一晒. ...

  9. Vue站点的搭建之旅

      背景       很久没写博客了,这次博客分享一下最近上班空闲时间做的两个业余Demo.分别是V电影App的移动端站点[一直很喜欢用这个APP可是他们没有出对应的mobile端,所以自己开发一个, ...

  10. 【HDFS API编程】副本系数深度剖析

    上一节我们使用Java API操作HDFS文件系统创建了文件a.txt并写入了hello hadoop(回顾:https://www.cnblogs.com/Liuyt-61/p/10739018.h ...