JPA学习笔记(三)—— JPA API

文章目录

  • 1. Persistence
  • 2. EntityManager
    • 2.1 find(Class aClass, Object o)
    • 2.2 getReference(Class aClass, Object o)
    • 2.3 persist(Object o)
    • 2.4 persist(Object o)
    • 2.5 merge(Object o)
    • 2.6 flush(Object o)
    • 2.7 createQuery(String qlString)
    • 2.8 createNamedQuery(String name)
    • 2.9 createNativeQuery(String sqlString)
    • 2.10 createNativeQuery(String sqls, String resultSetMapping)
  • 3. EntityTransaction
    • 3.1 begin()
    • 3.2 commit()
    • 3.3 rollback()

1. Persistence

Persistence 类用于获取 EntityManagerFactory 实例。该类包含一个名为 createEntityManagerFactory 的静态方法 。
createEntityManagerFactory 方法有如下两个重载版本。

  1. 带有一个参数的方法以 JPA 配置文件 persistence.xml 中的持久化单元名为参数。
  2. 带有两个参数的方法:前一个参数含义相同,后一个参数 Map 类型,用于设置 JPA 的相关属性,这时将忽略其它地方设置的属性。
    例如:
    Map<String, Object> properties = new HashMap<>();
    properties.put("hibernate.show_sql", false);
    

2. EntityManager

2.1 find(Class aClass, Object o)

类似于 Hibernate 中 Session 的 get 方法。
在调用 find 方法的同时就发送 SELECT 语句。

@Test
public void testFind() {
    Customer customer = entityManager.find(Customer.class, 1);
}

2.2 getReference(Class aClass, Object o)

类似于 hibernate 中 Session 的 load 方法。
返回的是 Customer 对象的代理,真正要使用的时候才会发送 SELECT 语句查询。
与 Hibernate 相同,若在 customer 还是代理对象时关闭 transaction ,会出现懒加载异常。

@Test
public void testGetReference() {
    Customer customer = entityManager.getReference(Customer.class, 1);
}

2.3 persist(Object o)

类似于 hibernate 的 save 方法,使对象由临时状态变为持久化状态。
和 hibernate 的 save 方法的不同之处:若对象有 id,则不能执行 insert 操作,而会抛出 PersistenceException 异常。

@Test
public void testPersistence() {
	entityManager.persist(new Customer());
}

2.4 persist(Object o)

类似于 hibernate 中 Session 的 delete 方法,对象对应的记录从数据库中移除。
但注意: 该方法只能移除持久化对象,而 hibernate 的 delete 方法实际上还可以移除游离对象。

@Test
public void testRemove() {
    Customer customer = entityManager.find(Customer.class, 2);
    entityManager.remove(customer);
}

2.5 merge(Object o)

总的来说:类似于 hibernate Session 的 saveOrUpdate 方法。

  1. 若传入的是一个临时对象,会创建一个新的对象,把临时对象的属性复 制到新的对象中,然后对新的对象执行持久化操作。

    所以新的对象中有 id,但以前的临时对象中没有 id。

  2. 若传入的是一个游离对象, 即传入的对象有 OID

    1. 若在 EntityManager 缓存中没有该对象
    2. 若在数据库中对应的记录
    3. JPA 会查询对应的记录, 然后返回该记录对一个的对象, 再然后会把游离对象的属性复制到查询到的对象中
    4. 对查询到的对象执行 update 操作
  3. 若传入的是一个游离对象, 即传入的对象有 OID

    1. 若在 EntityManager 缓存中没有该对象
    2. 若在数据库中也没有对应的记录
    3. JPA 会创建一个新的对象, 然后把当前游离对象的属性复制到新创建的对象中
    4. 对新创建的对象执行 insert 操作
  4. 若传入的是一个游离对象, 即传入的对象有 OID

    1. 若在 EntityManager 缓存中对应的对象
    2. JPA 会把游离对象的属性复制到 EntityManager 缓存中的对象中
    3. 对 EntityManager 缓存中的对象执行 UPDATE

2.6 flush(Object o)

同 hibernate 中 Session 的 flush 方法
使缓存中对象的状态与数据库中实体的状态保持一致

2.7 createQuery(String qlString)

创建一个查询对象。

2.8 createNamedQuery(String name)

根据命名的查询语句块创建查询对象。参数为命名的查询语句。

2.9 createNativeQuery(String sqlString)

使用标准 SQL语句创建查询对象。参数为标准SQL语句字符串。

2.10 createNativeQuery(String sqls, String resultSetMapping)

使用标准SQL语句创建查询对象,并指定返回结果集 Map的 名称。

3. EntityTransaction

3.1 begin()

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

3.2 commit()

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

3.3 rollback()

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

你可能感兴趣的:(JPA,java,hibernate,mysql,jpa)