3、JPA-API
一、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的更多相关文章
- JPA API与注解
一.JPA API Persistence 类:用于获取 EntityManagerFactory 实例,该类含有静态方法 createEntityManagerFactory. //persiste ...
- 4、JPA table主键生成策略(在JPA中table策略是首推!!!)
用 table 来生成主键详解 它是在不影响性能情况下,通用性最强的 JPA 主键生成器.这种方法生成主键的策略可以适用于任何数据库,不必担心不同数据库不兼容造成的问题. initialValue不起 ...
- 3、JPA一些常用的注解
常用注解有下面这些: ①:@Entity.@Table.@Id.@GeneratedValue.@Column.@Basic ②:@Transient 用于忽略某个属性,而不对该属性进行持久化操作 ③ ...
- 转:spring data jpa、 hibernate、 jpa 三者之间的关系
原文链接:spring data jpa. hibernate. jpa 三者之间的关系 spring data jpa hibernate jpa 三者之间的关系 JPA规范与ORM框架之间的关系是 ...
- spring data jpa、 hibernate、 jpa 三者之间的关系
http://www.cnblogs.com/xiaoheike/p/5150553.html JPA规范与ORM框架之间的关系是怎样的呢? JPA规范本质上就是一种ORM规范,注意不是ORM框架-- ...
- SpringData Jpa、Hibernate、Jpa 三者之间的关系
JPA规范与ORM框架之间的关系是怎样的呢? JPA规范本质上就是一种ORM规范,注意不是ORM框架--因为JPA并未提供ORM实现,它只是制订了一些规范,提供了一些编程的API接口,但具体实现则由服 ...
- 【Spring Data 系列学习】了解 Spring Data JPA 、 Jpa 和 Hibernate
在开始学习 Spring Data JPA 之前,首先讨论下 Spring Data Jpa.JPA 和 Hibernate 之前的关系. JPA JPA 是 Java Persistence API ...
- 为什么放弃Hibernate、JPA、Mybatis,最终选择JDBCTemplate
一.前言 因为项目需要选择数据持久化框架,看了一下主要几个流行的和不流行的框架,对于复杂业务系统,最终的结论是,JOOQ是总体上最好的,可惜不是完全免费,最终选择JDBC Template. Hibe ...
- JDBC、ORM、JPA、Spring Data JPA,傻傻分不清楚?一文带你厘清个中曲直,给你个选择SpringDataJPA的理由!
序言 Spring Data JPA作为Spring Data中对于关系型数据库支持的一种框架技术,属于ORM的一种,通过得当的使用,可以大大简化开发过程中对于数据操作的复杂度. 本文档隶属于< ...
- Web jquery表格组件 JQGrid 的使用 - 4.JQGrid参数、ColModel API、事件及方法
系列索引 Web jquery表格组件 JQGrid 的使用 - 从入门到精通 开篇及索引 Web jquery表格组件 JQGrid 的使用 - 4.JQGrid参数.ColModel API.事件 ...
随机推荐
- 【XSY2732】Decalcomania 可持久化线段树 分治
题目描述 有一个陶瓷瓶周围有\(n\)个可以印花的位置.第\(i\)个与第\(i+1\)个位置之间的距离为\(d_i\),在第\(i\)个位置印图案要\(t_i\)秒. 机器刚开始在\(0\)号位置, ...
- 三天STL与pbds(平板电视)
19.02.11 ~ 19.02.13 hjmmm要专攻STL辣 先列一下大纲? 第一天:各种基础容器 第二天:实现平衡树和平板电视pbds 第三天:非变异算法和变异算法 那么我们就开始吧! Day1 ...
- Wannafly挑战赛 22
爆零祭 T1 这题第一反应gcd啊 所以就把每个a[i]对m取模 然后求它们的gcd 即res = gcd(a[1] % m, a[2] % m, ... , a[n] % m) ans = 1 + ...
- 自学华为IoT物联网_01 物联网概述
点击返回自学华为IoT物流网 自学华为IoT物联网_01 物联网概述 1. 物联网的概念 百度百科: 物联网(Internet of Things),国内外普遍公认的是MIT Auto-ID中心Ash ...
- 【BZOJ3157/3516】国王奇遇记(数论)
[BZOJ3157/3516]国王奇遇记(数论) 题面 BZOJ3157 BZOJ3516 题解 先考虑怎么做\(m\le 100\)的情况. 令\(f(n,k)=\displaystyle \sum ...
- 【arc073e】Ball Coloring(线段树,贪心)
[arc073e]Ball Coloring(线段树,贪心) 题面 AtCoder 洛谷 题解 大型翻车现场,菊队完美压中男神的模拟题 首先钦定全局最小值为红色,剩下的袋子按照其中较大值排序. 枚举前 ...
- Nowcoder | [题解-N210]牛客OI月赛2-提高组
比赛连接戳这里^_^ 我才不会说这是我出的题(逃) 周赛题解\((2018.10.14)\) \(T1\) \(25\sim50\)分做法\(:\)直接爆搜 作为一个良心仁慈又可爱的出题人当然\(T1 ...
- 协同过滤算法 teamCF
http://www.infoq.com/cn/articles/recommendation-algorithm-overview-part02
- [NOI2016]优秀的拆分&&BZOJ2119股市的预测
[NOI2016]优秀的拆分 https://www.lydsy.com/JudgeOnline/problem.php?id=4650 题解 如果我们能够统计出一个数组a,一个数组b,a[i]表示以 ...
- 20165223 week2学习查漏补缺
标识符.字符集.关键字 基本数据类型 逻辑类型:boolean 常量:true.false 变量:boolean赋值 整数类型:byte.short.long.int 注意long型后缀L Java没 ...