3、JPA-API

2021-06-16 12:03

阅读:691

标签:factory   manager   factor   上下   不能   设置   静态   属性   包含   

Persistence

Persistence 类用于获取 EntityManagerFactory 实例,该类包含一个名为 createEntityManagerFactory 的静态方法 。

createEntityManagerFactory 方法有两个重载。

// persistence.xml 的持久化单元名
String persistenceUnitName = "jpaname";
/** * 带有一个参数的方法:以 JPA 配置文件 persistence.xml 中的持久化单元名为参数 */ EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitName);
// persistence.xml 的持久化单元名
String persistenceUnitName = "jpaname";

Map properites = new HashMap(10);
properites.put("hibernate.show_sql", true);

/** * 带有两个参数的方法:后一个参数 Map类型,用于设置 JPA 的相关属性,这时将忽略其它地方设置的属性,Map 对象的属性名必须是 JPA 实现库提供商的名字空间约定的属性名 */ EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitName, properites);

EntityManagerFactory

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

// 创建 EntityManager. 类似于 Hibernate 的 SessionFactory
EntityManager entityManager = entityManagerFactory.createEntityManager();

EntityManager

在 JPA 规范中,EntityManager 是完成持久化操作的核心对象。

实体作为普通 Java 对象,只有在调用 EntityManager 将其持久化后才会变成持久化对象。

EntityManager 对象在一组实体类与底层数据源之间进行 O/R 映射的管理,它可以用来管理和更新 Entity Bean,根椐主键查找 Entity Bean,还可以通过JPQL语句查询实体。

 

EntityManager#find

package jpa.test;

import com.jpa.entity.Customer;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class JPATest {

    private EntityManagerFactory entityManagerFactory;
    private EntityManager entityManager;
    private EntityTransaction transaction;

    @Before
    public void init(){
        entityManagerFactory = Persistence.createEntityManagerFactory("jpaname");
        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() {
        Customer customer = entityManager.find(Customer.class, 1);
        System.out.println("-------------------------------------");
        System.out.println(customer);
    }
}

技术图片

EntityManager#getReference

// 类似于 hibernate 中 Session 的 load 方法
@Test
public void testGetReference(){
    Customer customer = entityManager.getReference(Customer.class, 1);
    System.out.println(customer.getClass().getName());
    System.out.println("-------------------------------------");
    System.out.println(customer);
}
技术图片 
// 在使用之前关闭 EntityManager,会发生懒加载异常
@Test
public void testGetReference(){
    Customer customer = entityManager.getReference(Customer.class, 1);
    System.out.println(customer.getClass().getName());
    System.out.println("-------------------------------------");
    transaction.commit();
    entityManager.close();
    System.out.println(customer);
}
技术图片

实体类的几种状态:

新建状态:新创建的对象,尚未拥有持久性主键。

持久化状态:已经拥有持久性主键并和持久化建立了上下文环境。

游离状态:拥有持久化主键,但是没有与持久化建立上下文环境。

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

EntityManager#persistence

// 类似于 hibernate 的 save 方法. 使对象由临时状态变为持久化状态
// 和 hibernate 的 save 方法的不同之处: 若对象有 id, 则不能执行 insert 操作, 会抛出异常
@Test
public void testPersistence(){
    Customer customer = new Customer();
    customer.setAge(15);
    customer.setBirth(new Date());
    customer.setCreatedTime(new Date());
    customer.setEmail("bb@163.com");
    customer.setLastName("BB");
    
    //customer.setId(100);
    
    entityManager.persist(customer);
    
    System.out.println(customer.getId());
}
 
技术图片

EntityManager#remove

// 类似于 hibernate 中 Session 的 delete 方法,把对象对应的记录从数据库中移除
// 该方法只能移除 持久化 对象,而 hibernate 的 delete 方法实际上还可以移除 游离对象
@Test public void testRemove(){ // Customer customer = new Customer(); // customer.setId(2); Customer customer = entityManager.find(Customer.class, 2); entityManager.remove(customer); }

 

3、JPA-API

标签:factory   manager   factor   上下   不能   设置   静态   属性   包含   

原文地址:https://www.cnblogs.com/jhxxb/p/10348702.html


评论


亲,登录后才可以留言!