一、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. 为什么放弃Hibernate、JPA、Mybatis,最终选择JDBCTemplate

    一.前言 因为项目需要选择数据持久化框架,看了一下主要几个流行的和不流行的框架,对于复杂业务系统,最终的结论是,JOOQ是总体上最好的,可惜不是完全免费,最终选择JDBC Template. Hibe ...

  9. JDBC、ORM、JPA、Spring Data JPA,傻傻分不清楚?一文带你厘清个中曲直,给你个选择SpringDataJPA的理由!

    序言 Spring Data JPA作为Spring Data中对于关系型数据库支持的一种框架技术,属于ORM的一种,通过得当的使用,可以大大简化开发过程中对于数据操作的复杂度. 本文档隶属于< ...

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

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

随机推荐

  1. puppet一个完整的实例

    一个具体实例来简单说明puppet的具体结构 创建第一个配置 puppet的组成清单这主要包含这几个部分 资源,文件,模板,节点,类,定义 puppet中有个模块的定义,这个比较重要,基本是puppe ...

  2. BZOJ 2049 洞穴勘测

    LCT判断联通性 没什么特别的..还是一个普通的板子题,把LCT当并查集用了,只不过LCT灵活一些,还可以断边 话说自从昨天被维修数列那题榨干之后我现在写splay都不用动脑子了,,机械式的码spla ...

  3. Java 视频处理,截帧操作

    1.maven <dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv</ ...

  4. Min_25 筛小结

    Min_25 筛这个东西,完全理解花了我很长的时间,所以写点东西来记录一些自己的理解. 它能做什么 对于某个数论函数 \(f\),如果满足以下几个条件,那么它就可以用 Min_25 筛来快速求出这个函 ...

  5. LOJ2557. 「CTSC2018」组合数问题

    LOJ2557. 「CTSC2018」组合数问题 这道题是我第一道自己做完的题答题.考场上面我只拿了41分,完全没有经验.现在才发现其实掌握了大概的思路还是不难. 首先模拟退火,通过了1,2,6,9, ...

  6. edit 控件之隐藏光标

    @2019-02-22 [小记] 禁止聚焦功能便可实现

  7. Equivalent Sets HDU - 3836 (Tarjan)

    题目说给出一些子集,如果A是B的子集,B是A的子集,那么A和B就是相等的,然后给出n个集合m个关系,m个关系表示u是v的子集,问你最小再添加多少个关系可以让这n个集合都是相等的 如果这n个几个都是互相 ...

  8. hdu 3746 Cyclic Nacklace(kmp最小循环节)

    Problem Description CC always becomes very depressed at the end of this month, he has checked his cr ...

  9. servlet 上下文

    一.应用需求: 如何统计网站在线人数? 使用ServletContext. 二.ServletContext详解: 1.是不同于session和cookie,是可以让所有客户端共同访问的内容,是在服务 ...

  10. 跟着underscore学防抖

    前言 在前端开发中会遇到一些频繁的事件触发,比如: window 的 resize.scroll mousedown.mousemove keyup.keydown -- 为此,我们举个示例代码来了解 ...