JPA之EntityManager API

本文详细介绍了Java Persistence API (JPA) 中的核心方法,包括find、getReference、persist、remove等,对比了它们与Hibernate中对应方法的区别,并通过具体示例展示了如何使用这些方法。
摘要由CSDN通过智能技术生成

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(这是一个测试类,如果对此不了解,可以看看JUnit的使用)

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);
	}

}

欢迎访问我的个人博客http://www.chengzequn.top

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值