JPA基础(四)之JPA 的 API

标准查询结构

该标准与 JPQL 是密切相关的,并允许使用类似的操作符在他们的查询设计。
它遵循 javax.persistence.criteria 包设计一个查询。查询结构指的语法条件查询。

从第一个 jpa 案例中,我使用到的几个基本的 jpa 的 API 类:

  • Persistence:主要作用就是通过它的静态方法createEntityManagerFactory 获取EntityManagerFactory (相当于 Hibernate 的 SessionFactory)
  • EntityManagerFactory :主要作用就是获取 EntityManager 的实例对象,EntityManager 相当于 Hibernate 的 Session
  • EntityManager 操作数据库的方法:主要作用就是操作数据库,执行增删改查,对应的方法 persist(增),find 和 getReferenc(查一条记录),remove (删),merge(改)
  • EntityManager 的 createQuery(),createNamedQuery(), createNativeQuery()这些方法也和 hibernate 里的方法非常类似,我们讲 jpql 查询的时候会具体使用的,到时
    再讲
    ⑤EntityTransaction:jpa 里的事务管理,begin(),commit(),rollback()等等常用方
    法和 hibernate 里也是一样的

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

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

persist 方法
persist (Object entity):用于将新创建的 Entity 纳入到 EntityManager 的管理。该方法执行后,传入 persist() 方法的 Entity 对象转换成持久化状态。
如果传入 persist() 方法的 Entity 对象已经处于持久化状态,则 persist() 方法什么都不做。如果对删除状态的 Entity 进行 persist() 操作,会转换为持久化状态。如果对游离状态的实体执行 persist() 操作,可能会在 persist() 方法抛出EntityExistException(也有可能是在 flush 或事务提交后抛出)。

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

merge 方法
merge (T entity):merge() 用于处理 Entity 的同步。即数据库的插入和更新操作。
原理图如下:
在这里插入图片描述
flush 方法
顾名思义,强制刷新。同步持久上下文环境,即将持久上下文环境的所有未保存实体的状态信息保存到数据库中。

refresh 方法
refresh (Object entity):用数据库实体记录的值更新实体对象的状态,即更新实例的属性值。即,刷新内存中对象的属性。

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

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

isOpe()方法
判断当前的实体管理器是否是打开状态。

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

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

createQuery 方法
createQuery (String qlString):创建一个查询对象。
createNamedQuery (String name):根据命名的查询语句块创建查询对象。参数为命名
的查询语句。

createNativeQuery 方法-1
createNativeQuery (String sqlString):使用标准 SQL 语句创建查询对象。参数为标准 SQL 语句字符串。

createNativeQuery 方法-2
createNativeQuery (String sqls, String resultSetMapping):使用标准 SQL 语句创建查询对象,并指定返回结果集 Map 的 名称。

实体的状态

在 JPA 中实体对象的状态分为一下四种状态

  1. 新建状态: 新创建的对象,尚未拥有持久性主键;
  2. 持久化状态: 已经拥有持久性主键并和持久化建立了上下文环境;
  3. 游离状态: 拥有持久化主键,但是没有与持久化建立上下文环境;
  4. 删除状态: 拥有持久化主键,已经和持久化建立上下文环境,但是从数据库中删除。

代码:

@Test
public void test3() {
	// EntitymanagerFactory
	EntityManagerFactory factory = 
		Persistence.createEntityManagerFactory("jpademo");
	// MyBatis---SqlSession JPA --- EntityManager
	EntityManager entityManager = factory.createEntityManager();
	EntityTransaction tx = entityManager.getTransaction();
	
	tx.begin();
	
	Customer customer = new Customer();
	customer.setName("小飞飞");
	customer.setTelephone("1354356765");
	System.out.println("初始化状态.. 新建状态 在内存中存在 但是在数据库中没有对应记录");
	entityManager.persist(customer);
	System.out.println("持久状态.....");
	
	tx.commit();
	// 清除 entityManager 中的缓存
	entityManager.clear();
	System.out.println("游离状态-- customer 对象从 entityManager 管理中移除");
	
	tx.begin();
	customer.setName("小猪佩奇");
	entityManager.merge(customer);
	System.out.println("持久状态....");
	tx.commit();
	
	tx.begin();
	entityManager.remove(entityManager.merge(customer));
	System.out.println("删除状态");
	tx.commit();
	
	System.out.println(customer);
}

更多JPA相关知识请点击此处

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值