jpa entitymanagerrfactory怎么维护管理

Last queries:
Information on class javax.persistence.EntityManagerFactory:
Containing JAR files:JPA 实体管理器工厂(EntityManagerFactory)
看到实体管理器工厂 EntityManagerFactory是获得实体管理器EntityManager对象的入口,而EntityManagerFactory对象是通过javax.persistenc.Persistence类中的静态方法createEntityManagerFactory来创建的。
例如下面代码所示。
EntityManagerFactory emf =
javax.persistence.Persistence.createEntityManagerFactory(&jpaUnit&);
EntityManager em = emf.createEntityManager();
下面首先详细了解一下javax.persistenc.Persistence类中的API。
11.2.1javax.persistenc.Persistence API
javax.persistenc.Persistence类提供了两个手动创建EntityManagerFactory对象的方法,它们的定义如下所示。
package javax.
import java.util.*;
public class Persistence {
public static EntityManagerFactorycreateEntityManagerFactory(
String persistenceUnitName) {...}
public static EntityManagerFactory createEntityManagerFactory(
String persistenceUnitName, Map properties) {...}
其中,createEntityManagerFactory(String persistenceUnitName, Map properties)方法中properties的参数将覆盖persistence.xml文件配置的参数。
例如persistence.xml中的元素中的配置如下所示。
org.hibernate.ejb.HibernatePersistence
其中,属性 hibernate.show_sql的值为true,若创建EntityManagerFactory对象时采用以下的代码,则实际获得的 EntityManagerFactory对象属性hibernate.show_sql则为false,即为代码中所设置的将覆盖配置文件中所配置的,如下所示。
Map properties= new HashMap();
properties.put(&hibernate.show_sql&, &false&);
EntityManagerFactory emf = Persistence.createEntityManagerFactory(&jpaUnit&, properties);
11.2.2EntityManagerFactoryAPI
上一节创建了EntityManagerFactory对象,那么如何使用EntityManagerFactory对象创建EntityManager对象呢?下面来看EntityManagerFactory的定义,如下所示。
public interface javax.persistence.EntityManagerFactory{
public EntityManager createEntityManager();
public EntityManagercreateEntityManager(Map map);
public void close();
public boolean isOpen();
在创建EntityManagerFactory对象后,使用完后应该及时关闭。所以使用创建Entity ManagerFactory的代码如下所示。
EntityManagerFactory emf = Persistence.createEntityManagerFactory(&jpaUnit&);
EntityManager entityManager = emf.createEntityManager();
entityManager.close();
emf.close();
11.2.3实现自己的JPA
细心的读者可能会有疑问,为什么如下的简单代码就可以创建名称为&jpaUnit&的EntityManagerFactory对象呢?
EntityManagerFactory emf = Persistence.createEntityManagerFactory(&jpaUnit&);
虽然这部分内容在使用JPA时并不需要了解,但如果读者想要自己实现JPA规范,这些内容是必须要了解的。
下面以笔者自己实现的简单例子,详细讲述其中的原理。通过这个完整的例子,读者可以对JPA的实现有更深刻的理解。
11.2.3.1实现PersistenceProvider接口
首先编写一个类JPAPersistence并实现javax.persistence.spi.PersistenceProvider类,代码如下所示。
package com.fengmanfei.
import java.util.M
import javax.persistence.EntityManagerF
import javax.persistence.spi.PersistenceP
import javax.persistence.spi.PersistenceUnitI
public classJPAPersistence implements PersistenceProvider {
public EntityManagerFactorycreateContainerEntityManagerFactory(
PersistenceUnitInfo persistenceunitinfo, Map map) {
System.out.println(this.getClass().getName()
+ &.createContainerEntityManagerFactory&
+ &(PersistenceUnitInfo persistenceunitinfo,Map map)自己实现的方法&);
return new EntityManagerFactoryImpl();
public EntityManagerFactory createEntityManagerFactory(String s, Map map) {
System.out.println(this.getClass().getName()
+ &.createContainerEntityManagerFactory&
+ &(String s, Map map)自己实现的方法&);
return new EntityManagerFactoryImpl();
由于这里只是简单地说明如何初始化JPA的实现,所以只打印出调用方法的信息,并返回EntityManagerFactoryImpl对象。
11.2.3.2实现EntityManagerFactory接口
然后编写一个简单的实现EntityManagerFactory接口的类EntityManagerFactoryImpl,代码如下所示。
package com.fengmanfei.
import java.util.M
import javax.persistence.EntityM
import javax.persistence.EntityManagerF
public class EntityManagerFactoryImplimplements EntityManagerFactory {
public void close() {
public EntityManagercreateEntityManager() {
public EntityManager createEntityManager(Map map) {
public boolean isOpen() {
其中,这里接口中的方法笔者并没有编写自己的实现,读者如果需要可以自己添加代码。对于这里所实现的 javax.persistence.spi.PersistenceProvide类所在的包,可以通过JPA的官方网站下载,也可以从 &JBOSS_HOME\server\default\lib&目录下的ejb3-persistence.jar包中获得,在编译时要将这个类包添加到构建路径中。
11.2.3.3定义自己的实现类
在META-INF文件目录下创建services\javax.persistence.spi.PersistenceProvider文件,在该文件中输入实现PersistenceProvider接口类的全名,如下所示。
com.fengmanfei.jpa.JPAPersistence
修改persistence.xml中的配置如下所示。
transaction-type=&RESOURCE_LOCAL&&
com.fengmanfei.jpa.JPAPersistence
其中要配置为所实现的javax.persistence.spi.PersistenceProvider接口类。这样当客户端创建&jpaUnit&EntityManagerFactory对象时,就会调用自己实现的方法。
例如,客户端代码如下所示。
public class CustomerClient {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence
.createEntityManagerFactory(&jpaUnit&);
程序运行后,控制台将输出如下所示的运行结果。
com.fengmanfei.jpa.JPAPersistence.createContainerEntityManagerFactory(String s, Map map)自己实现的方法
可以看到,当调用javax.persistenc.Persistence中的createEntityManagerFactory时,运行的是com.fengmanfei.jpa.JPAPersistence中的方法,并输出了相应的结果。
11.2.3.5加载原理
当调用 javax.persistenc.Persistence中的createEntityManagerFactory方法时,程序会自动查找当前类加载器中所有的META-INF/services/javax.persistence.spi.PersistenceProvider文件中定义的 JPA实现类,如果还未初始化,则首先将这些实现类实例化。如果实现类已经实例化,则根据根据&unitName&来创建对应的实现类,直到返回的 EntityManagerFactory不为null为止。版主,如果利用entityManager进行查询,如何在sql里边传参,防注入的那种&&&&JPA使用EntityManagerFactory开闭session,而Hibernate使用SessionFactory开闭session。两者区别:
1.&EntityManagerFactory是JPA的标准API,如果使用EntityManagerFactory,在更换实现JPA的ORM框架时,需要改动的代码很少。如果使用SessionFactory,因为SessionFactory是Hibernate的,无法直接更换ORM框架,更换ORM的话,需要修改所有的代码。
2. 如果想使用Hibernate的某些高级特性,只能使用SessionFactory,使用EntityManagerFactory无法享受Hibernate的高级用法。
阅读(...) 评论()}

我要回帖

更多关于 spring entitymanager 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信