JPA(三) JPA API初探

标签: JPA,API


Persistence 类

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

  • createEntityManagerFactory 方法有如下两个重载版本。
  • 带有一个参数的方法以 JPA 配置文件 persistence.xml 中的持久化单元名为参数
  • 带有两个参数的方法:前一个参数含义相同,后一个参数 Map类型,用于设置 JPA 的相关属性,这时将忽略其它地方设置的属性。Map 对象的属性名必须是 JPA 实现库提供商的名字空间约定的属性名。代码示例如下:
    //创建EntityManagerFactory方法
    String persistenceUnitName = "JAP-1";  //此处的名称为配置文件中的名称
    EntityManagerFactory factory = Persistence.createEntityManagerFactory(persistenceUnitName);

EntityManagerFactory 接口

主要用来创建 EntityManager 实例.该接口主要包含如下四个方法

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

EntityManager

在 JPA 规范中, EntityManager 是完成持久化操作的核心对象。实体作为普通 Java 对象,只有在调用 EntityManager 将其持久化后才会变成持久化对象。EntityManager 对象在一组实体类与底层数据源之间进行 O/R 映射的管理。它可以用来管理和更新 Entity Bean, 根椐主键查找 Entity Bean, 还可以通过JPQL语句查询实体。

    //开启事务
    EntityTransaction transaction = manager.getTransaction();
    transaction.begin();

find(Class entityClass,Object primaryKey) 方法

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

  //类似于Hibernate中session 的find方法
  @Test
  public void testFind() {
    Customer customer = manager.find(Customer.class,1);
    System.out.println("----------------------------");
    System.out.println(customer);
  }

getReference (Class entityClass,Object primaryKey) 方法

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

  //类似于Hibernate 中的 load 方法
  @Test
  public void testGetReference(){
    Customer customer = manager.getReference(Customer.class,1);
    System.out.println(customer.getClass().getName());
    System.out.println("----------------------------");
    System.out.println(customer);
  }

persist (Object entity) 方法

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

  /**
   * 类似于 Hibernate 的save 方法,使对象由临时状态变为持久化状态
   * 不同之处:若对象有 Id 则不能执行 Insert 操作,而会抛出异常
   */
  @Test
  public void testPersistence(){
    Customer customer = new Customer();
    customer.setAge(12);
    customer.setEmail("123");
    customer.setLastName("Tom");
    customer.setCreateDate(new Date());
    customer.setBirthday(new Date());
    manager.persist(customer);
    System.out.println("Id=" + customer.getId());
  }

remove (Object entity) 方法

删除实例。如果实例是被管理的,即与数据库实体记录关联,则同时会删除关联的数据库记录。

  /**
   * 类似于 Hibernate 的delete 方法,把对象对应的记录从数据库删除
   * 在JPA中该方法只能删除持久化对象,但是 Hibernate 不但可以删除持久化对象,还可以删除游离对象
   */
  @Test
  public void testRemove(){
    //此代码会报错,因为该方法只能移除持久化对象,不能移除游离对象
//    Customer customer = new Customer();
//    customer.setId(3);

    //正确的方法
    Customer customer =manager.find(Customer.class, 3);
    manager.remove(customer);
  }