【JPA】EntitryManager实体管理器(一)

来源:互联网 发布:python json encode 编辑:程序博客网 时间:2024/05/16 01:47
        JPA的实体在被数据库持久化之前,需要调用EntityManager接口,这意味着持久化的真正工作是委托给实体管理器来完成的。通过把实体作为参数传递给一个方法调用,或者是从数据库直接读取它,实体管理器能够获得一个实体的引用。 EntiryManager实体管理器来自于EntityManagerFactory工厂。这里涉及几个相关的概念,持久化单元、持久化上下文,按照上面的说法,持久化上下文persitencecontext是指实体管理器在任何给定的时间内所管理的所有实体实例的集合,持久化单元被EntityManagerFactory管理工厂显示或隐式指定。程序代码形式如下:

EntityManagerFactory entityManagerFactory =Persistence.createEntityManagerFactory("EmployeeService");其中EmployeeService即为持久化单元,一个持久化单元由一个实体管理器工厂管理配置。在配置文件中的位置位于根目录下【META-INF】文件夹下定义persistence.xml持久化单元配置文件,所谓的持久化单元就相当于一个数据源。

<?xml version="1.0" encoding="UTF-8"?><persistence version="2.0"    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">    <persistence-unit name="EmployeeService" transaction-type="RESOURCE_LOCAL">       <properties>           <property name="hibernate.dialect"                                    value="org.hibernate.dialect.MySQL5Dialect" />           <property name="hibernate.connection.driver_class"                                    value="com.mysql.jdbc.Driver" />           <property name="hibernate.connection.url" value="jdbc:mysql://localhost/jpa_db             ?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=utf8" />           <property name="hibernate.connection.username" value="root" />           <property name="hibernate.connection.password" value="root" />           <property name="hibernate.max_fetch_depth" value="3"/>                       <!--                create-drop                update 如果表不存在则会更新表,或者代码中加了属性,导致表生成一列           -->           <property name="hibernate.hbm2ddl.auto" value="update"/>                      <property name="hibernate.show_sql" value="true" />           <property name="hibernate.format_sql" value="false" />        </properties>   </persistence-unit></persistence>

实体管理器工厂创建实体管理器进而进行持久化操作。程序代码如下:

       EntityManager entityManager = entityManagerFactory.createEntityManager();  

一、持久化数据操作,entityManager.persist(Entity),Entity即为临时对象,调用persist方法持久化对象。

@Testpublic void SaveEmployee() {   EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory                                               ("JPAUNIT");   EntityManager entityManager = entityManagerFactory.createEntityManager();   entityManager.getTransaction().begin();   Employee employee = new Employee();   employee.setName("Tony");   employee.setSalary(25);   entityManager.persist(employee);   entityManager.getTransaction().commit();}

二、寻找实体,entityManage.find(Class,id),通过实体管理器对实体在数据库中进行寻找,当调用完成时,返回的Employee将是一个托管实体,这意味着它将存在与当前实体管理器所关联的持久化上下文中。

@Testpublic void findEmployee() {EntityManagerFactory entityManagerFactory = Persistence.                                           createEntityManagerFactory("JPAUNIT");EntityManager entityManager = entityManagerFactory.createEntityManager();entityManager.getTransaction().begin();Employee employee = entityManager.find(Employee.class, 1);/** * 当实体主键ID在数据库中不存在时,实体管理器返回null * 在使用返回的托管实体前,要确保空检查,否则可能会抛出空指针异常 */if(employee!=null) {System.out.println(employee.toString());}}

三、remove()删除实体,删除实体之前必须确保持久化上下文中存在当前实体,之后调用remove()方法告诉数据库进行删除操作。

@Testpublic void deleteEmployee() {        EntityManagerFactory entityManagerFactory = Persistence.                                           createEntityManagerFactory("JPAUNIT");EntityManager entityManager = entityManagerFactory.createEntityManager();entityManager.getTransaction().begin();/**在删除之前得到被托管的实体**/Employee employee = entityManager.find(Employee.class, 1);/**调用remove从数据库中删除**/entityManager.remove(employee);entityManager.getTransaction().commit();}
find()数据时,当对象已经被删除或id不存在时,find会返回null,所在再进行remove()时要进行空检查一下。

0 0
原创粉丝点击