JPA API

本文参考自: 原文地址

Persistence

Persistence  类是用于获取 EntityManagerFactory 实例。该类包含一个名为 createEntityManagerFactory 的 静态方法 。
createEntityManagerFactory 方法有如下两个重载版本。
带有一个参数的方法以 JPA 配置文件 persistence.xml 中的持久化单元名为参数

带有两个参数的方法:前一个参数含义相同,后一个参数 Map类型,用于设置 JPA 的相关属性,这时将忽略其它地方设置的属性。Map 对象的属性名必须是 JPA 实现库提供商的名字空间约定的属性名。

EntityManagerFactory

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

 String persistenceUnitName = "jpa-1";
 Map<String, Object> properties = new HashMap<>();
 properties.put("hibernate.show_sql", true);
 //重载的方法,将配置文件中的配置以map的形式传给该方法,不会用到
        //EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitName, properties);
 //创建 EntityManagerFactory 对象
 EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitName);

EntityManager

在 JPA 规范中, EntityManager 是完成持久化操作的核心对象。实体作为普通 Java 对象,只有在调用 EntityManager 将其持久化后才会变成持久化对象。EntityManager 对象在一组实体类与底层数据源之间进行 O/R 映射的管理。它可以用来管理和更新 Entity Bean, 根椐主键查找 Entity Bean, 还可以通过JPQL语句查询实体。
 实体的状态:
新建状态:   新创建的对象,尚未拥有持久性主键。
持久化状态:已经拥有持久性主键并和持久化建立了上下文环境
游离状态:拥有持久化主键,但是没有与持久化建立上下文环境

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

find

Customer customer = entityManager.find(Customer.class, 7);

getReference方法是懒加载的

Customer customer = entityManager.getReference(Customer.class, 7);
persist方法持久化的对象的id必须为空,否则报错,对比hibernate的save方法则不一样,save方法可以传入对象的id再进行持久化
persist方法之后,即使没有提交事务,被持久化的对象也会有id
Customer customer = new Customer();
customer.setName("guoanni");
customer.setEmail("[email protected]");
customer.setAge(25);
customer.setBirth(new Date());
customer.setCreateDate(DateTime.now());
customer.setLastUpdateDate(LocalDate.now());
		
entityManager.persist(customer);
//remove方法不能删除游离状态的对象
//而hibernate的delete方法可以删除游离状态和非游离状态的对象
Customer customer = entityManager.find(Customer.class, 27);
entityManager.remove(customer);


merge方法,这个方法时最复杂的方法,分为四种情况(在做笔记的时候写的不是很有条理,所以看的时候可能有些吃力,还是希望小伙伴能够认真理解,自己动手试一试):

// 持久化一个新建的对象(传入的是一个没有id的对象),返回一个对象,新建的对象持久化结束还是新建状态,
//   而返回的对象是持久化状态
// ***实际上没有持久化新建对象,而是JPA新建一个对象将新建对象的属性复制的JPA新建对象中,在进行持久化的
// 是不是持久化状态根据merge()方法之后对象是否有id来判断
Customer customer = new Customer();
customer.setName("wl");
customer.setEmail("[email protected]");
customer.setAge(23);
customer.setBirth(new Date());
customer.setCreateDate(DateTime.now());
customer.setLastUpdateDate(LocalDate.now());
Customer customer2 = entityManager.merge(customer);
System.out.println(customer.getId());// null
System.out.println(customer2.getId());// 32
// 事实证明传入一个数据库中没有的id的对象,对象作为新建对象来处理,传入的id没有作用
// 而执行merge之后返回的对象才是真正持久化状态的对象
Customer customer = new Customer();
customer.setName("wl");
customer.setEmail("[email protected]");
customer.setAge(23);
customer.setBirth(new Date());
customer.setCreateDate(DateTime.now());
customer.setLastUpdateDate(LocalDate.now());
// 为即将持久化的对象设置一个数据库中没有的id
customer.setId(100);


Customer customer2 = entityManager.merge(customer);
System.out.println(customer.getId());// 100
System.out.println(customer2.getId());// 37
// 1.传入一个数据库中有的id的对象,且在EntityManger缓存中没有该id对应的对象,会先查询数据库中对应id的记录
// 2.将记录返回
// 3.并将返回的对象的属性设置为新建对象的属性值
// 4.事务提交时对返回的对象进行更新
Customer customer = new Customer();
customer.setName("wuliang");
customer.setEmail("[email protected]");
customer.setAge(22);
customer.setBirth(new Date());
customer.setCreateDate(DateTime.now());
customer.setLastUpdateDate(LocalDate.now());
// 为即将持久化的对象设置一个数据库中已经有的id customer.setId(37);


Customer customer2 = entityManager.merge(customer);
System.out.println(customer == customer2);//false
//返回值为false证明两个对象不是同一个对象
//customer对象是新建的对象
//customer2是根据customer的id到数据库中查询到的对象,然后再将customer的属性赋给customer2对象
//事务提交时对customer2对象进行更新
// 传入的对象是一个新建的对象,即传入的对象有OID
// 1.若在EntityManager缓存中有对应的对象
// 2.JPA会把新建的对象复制到缓存中的对象
// 3.缓存中的对象会执行更新(update)
// 而在hibernate的session,是不用需session同时和两个拥有相同id的对象进行关联的
// EntityManager也是不允许的,但是JPA就行2、3中所说,他是将新建对象的值赋值给缓存中的对象
Customer customer = new Customer();
customer.setName("wuliang");
customer.setEmail("[email protected]");
customer.setAge(22);
customer.setBirth(new Date());
customer.setCreateDate(DateTime.now());
customer.setLastUpdateDate(LocalDate.now());
// 为即将持久化的对象设置一个缓存中中已经有的id customer.setId(37);

Customer customer2 = entityManager.merge(customer);
System.out.println(customer == customer2);//false
//返回值为false证明两个对象不是同一个对象
//customer对象是新建的对象
//customer2缓存中的对象,然后再将customer的属性赋给customer2对象
//事务提交时对customer2对象进行更新

Falush:

同步持久上下文环境,即将持久上下文环境的所有未保存实体的状态信息保存到数据库中。

setFlushMode :

设置持久上下文环境的Flush模式。参数可以取2个枚举
FlushModeType.AUTO 为自动更新数据库实体,

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

getFlushMode :

获取持久上下文环境的Flush模式。返回FlushModeType类的枚举值。

refresh :

用数据库实体记录的值更新实体对象的状态,即更新实例的属性值。

clear :

清除持久上下文环境,断开所有关联的实体。如果这时还有未提交的更新则会被撤消。

contains :

判断一个实例是否属于当前持久上下文环境管理的实体。

isOpen :

判断当前的实体管理器是否是打开状态。

getTransaction:

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

close :

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

EntityTransaction

EntityTransaction 接口用来管理资源层实体管理器的事务操作。通过调用实体管理器的getTransaction方法 获得其实例。
transaction = entityManager.getTransaction();
transaction.begin();
transaction.commit();

猜你喜欢

转载自blog.csdn.net/running987/article/details/81383414
JPA
今日推荐