博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JPA之EntityManager API
阅读量:6427 次
发布时间:2019-06-23

本文共 6769 字,大约阅读时间需要 22 分钟。

hot3.png

1.find(Class<T>  entityClass,Object primaryKey):返回指定的OID对应的实体对象,如果这个实体存在于当前的持久化环境,则返回一个被缓存的对象;否则会创建一个新的Entity,并加载数据库中相关信息;若OID不存在与数据库中,则返回一个null。第一个参数为被查询的实体类类型,第二个参数为待查找实体的关键值

2.getReference(Class<T> entityClass,Object primaryKey):与find()方法类似,不同的是:如果缓存中不存在指定的Entity,EntityManager会创建一个Entity类的代理,但是不会立即加载数据库中的信息,只有第一次真正使用此Entity的属性才加载,所以如果此OID在数据库不存在,getReference()不会返回null值,而是抛出EntityNotFoundException

3.persist(Object entity):用于将新创建的Entity纳入到EntityManager的管理。该方法执行后,传入persist()方法的Entity对象转换成持久化状态

-如果传入persist()方法的Entity对象已经处于持久化状态,则persist()方法什么都不做

-如果对删除状态的Entity进行persist()操作,会转换为持久化状态。

-如果对游离状态的实体执行persist()操作,可能会在persist()方法抛出EntityExistException(也有可能在flush或事务提交后抛出)

4.remove(Object entity):删除实例。如果实例是被管理的,即与数据库实体记录关联,则同时会删除关联的数据库记录。

5.merge(T entity):merge()用于处理Entity的同步。即数据库的插入和更新操作

6.flush():同步持久化上下文环境,即将持久化上下文环境环境的所有未保存实体的状态信息保存到数据库中

7.setFlushMode(FlushModeType flushMode):设置持久化上下文环境的Flush模式。参数可以取2个枚举

-FlushModeType.AUTO为自动更新数据库实体

-FlushModeType.COMMIT为直到提交事务时才更新数据库记录

8.getFlushMode():获取持久化上下文环境的Flush模式。返回FlushModeType类的枚举值

9.refresh(Object entity):用数据库实体记录的值更新实体对象的状态,即更新实例的属性值

10.clear():清除持久化上下文环境,断开所以关联的实体。如果这时还有未提交的更新,则会被撤销

11.contains(Object entity):判断一个实例是否属于当前持久上下文环境管理的实体

12.isOpen():判断当前的实体管理器是否是打开状态

13.getTransaction():返回资源层的事务对象。EntityTransaction实例可以用于开始和提交多个事务

14.close():关闭实体管理器。之后若调用实体管理器实例的方法或其派生的查询对象的方法都将抛出IllegalstaleException异常,除了getTransaction和isOpen方法(返回false)。不过,当与实体管理器关联的事务处于活动状态时,调用close方法后持久化上下文将仍处于被管理状态,直到事务完成。

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

begin():用于启动一个事务,此后的多个数据库操作将作为整体被提交或撤销。若这时事务已启动,则会抛出抛出IllegalstaleException异常

commit():用于提交当前事务,即将事务启动以后的所有数据库更新操作持久化至数据库中

rollback():撤销(回滚)当前事务。即撤销事务启动后的所有数据库更新操作,从而不对数据库产生影响

setRollbackOnly():使当前事务只能被撤销

getRollbackOnly():查看当前事务是否设置了只能撤销标志

isActive():查看当前事务是否是活动的。如果返回true则不能调用begin()方法,否则将抛出IllegalstaleException异常;如果返回false则不能调用commit、rollback、setRollbackOnly及getRollbackOnly方法,否则将抛出IllegalstaleException异常

 

Student.java

package com.f145a.jpa.helloworld;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.Table;@Entity@Table(name = "student")public class Student {	@Id	@GeneratedValue(strategy = GenerationType.IDENTITY)	private int id;	private String name;	private int age;	public int getId() {		return id;	}	public void setId(int id) {		this.id = id;	}	public String getName() {		return name;	}	public void setName(String name) {		this.name = name;	}	public int getAge() {		return age;	}	public void setAge(int age) {		this.age = age;	}	public Student() {	}	public Student(int id, String name, int age) {		super();		this.id = id;		this.name = name;		this.age = age;	}	@Override	public String toString() {		return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";	}}

JPATest.java(这是一个测试类,如果对此不了解,可以看看)

package com.f145a.jpa.test;import javax.persistence.EntityManager;import javax.persistence.EntityManagerFactory;import javax.persistence.EntityTransaction;import javax.persistence.Persistence;import org.junit.After;import org.junit.Before;import org.junit.Test;import com.f145a.jpa.helloworld.Student;public class JPATest {	private EntityManagerFactory entityManagerFactory;	private EntityManager entityManager;	private EntityTransaction transaction;	@Before	public void init() {		entityManagerFactory = Persistence.createEntityManagerFactory("jpa-1");		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() {		Student student = entityManager.find(Student.class, 1);		System.out.println("------------------------------");		System.out.println(student);	}	// 类似于Hibernate中Session的load方法,在EntityManagerFactory关闭的情况下可能会出现懒加载	@Test	public void testGetReference() {		Student student = entityManager.getReference(Student.class, 1);		System.out.println("------------------------------");		System.out.println(student);	}	// 类似于Hibernate的save方法。使对象由临时状态变为持久化状态。	// 和Hibernate的sava的不同:若对象有id,则不能执行insert操作,会抛出异常	@Test	public void testPersistence() {		Student student = new Student();		student.setName("李四");		student.setAge(34);		// student.setId(100);		entityManager.persist(student);		System.out.println(student.getId());	}	// 类似于Hibernate中Session的delete方法,把对象对应的记录从数据库中移除	// 该方法只能移除持久化对象,而Hibernate的delete方法实际上还可以移除游离对象	@Test	public void testRemove() {		// Student student=new Student();		// student.setId(4);		Student student = entityManager.find(Student.class, 2);		entityManager.remove(student);	}	/**	 * 类似Hibernate中Session的save或update方法	 */	// 1.若传入的是一个临时对象,会创建一个新的对象,把临时对象的属性复制到新的对象中,	// 然后对新的对象执行持久化操作,所以新的对象中有id,但以前的临时对象中id为0或null	@Test	public void testMerge1() {		Student student = new Student();		student.setName("张三");		student.setAge(34);		Student student2 = entityManager.merge(student);		System.out.println("student#id:" + student.getId());		System.out.println("student2#id:" + student2.getId());	}	// 若传入的是一个游离对象(对象有OID)	// 1.若在EntityManager缓存中没有该对象	// 2.若在数据库中也没有对应的记录	// 3.JPA会创建一个新的对象,然后把当前游离对象的属性复制到新的对象中,对新创建的对象执行insert操作	@Test	public void testMerge2() {		Student student = new Student();		student.setName("张三");		student.setAge(34);		student.setId(100);		Student student2 = entityManager.merge(student);		System.out.println("student#id:" + student.getId());		System.out.println("student2#id:" + student2.getId());	}	// 若传入的是一个游离对象(对象有OID)	// 1.若在EntityManager缓存中没有该对象	// 2.若在数据库中有对应的记录	// 3.JPA会查询对应的记录,然后返回该记录的一个对象,之后把游离对象的属性复制到查询到的对象,对新创建的对象执行update操作	@Test	public void testMerge3() {		Student student = new Student();		student.setName("张三");		student.setAge(34);		student.setId(3);		Student student2 = entityManager.merge(student);		System.out.println(student == student2);// false	}	// 若传入的是一个游离对象(对象有OID)	// 1.若在EntityManager缓存中有该对象	// 3.JPA会把游离对象的属性复制到EntityManager缓存的对象中,EntityManager缓存中的对象执行update	@Test	public void testMerge4() {		Student student = new Student();		student.setName("张三峰");		student.setAge(43);		student.setId(3);		Student student2 = entityManager.find(Student.class, 3);		entityManager.merge(student);		System.out.println(student == student2);// false	}	// 同Hibernate中Session的flush方法	@Test	public void testFlush() {		Student student = entityManager.find(Student.class, 1);		System.out.println(student);		student.setName("王五");		entityManager.flush();	}	// 同Hibernate中Session的refresh方法	@Test	public void testRefresh() {		Student student = entityManager.find(Student.class, 1);		student = entityManager.find(Student.class, 1);		entityManager.refresh(student);	}}

欢迎访问我的个人博客

转载于:https://my.oschina.net/chengzequn/blog/790772

你可能感兴趣的文章
(LeetCode)两个队列来实现一个栈
查看>>
[WebGL入门]十九,遮挡剔除和深度測试
查看>>
Codeforces 220B - Little Elephant and Array 离线树状数组
查看>>
jquery封装常用方法
查看>>
Rest API 开发 学习笔记
查看>>
小练习:元素的拖放
查看>>
什么是ICE (Internet Communications Engine)
查看>>
移动web开发之屏幕三要素
查看>>
求按小时统计的语句,该怎么处理
查看>>
python中的@
查看>>
TRUNCATE,DORP,DELETE
查看>>
Chrome的开发必备小技巧
查看>>
can-i-win(好)
查看>>
Centos6.5下安装protobuf及简单使用
查看>>
[SharePoint] SharePoint 错误集 3
查看>>
高压光耦
查看>>
[转]DPM2012系列之六:在Win7上安装DPM远程管理控制台
查看>>
postgres函数
查看>>
Microsoft AJAX Library Cheat Sheet(5): Number和Error类型的扩展
查看>>
批处理设置Java环境变量/命令行设置Java环境变量
查看>>