JPA EntityManager功能与原理

作者&投稿:绪杰 (若有异议请与网页底部的电邮联系)
~ JPA,即Java Persistence API,是JavaEE中的一种orm标准,被视为一套接口。Hibernate等ORM引擎实现了这一标准。其中,EntityManager是一个接口,它提供了对象持久化的核心API。

常用的EntityManager实现有两个:Hibernate Session和单例注入的代理EntityManager。Hibernate Session真正实现了接口功能,而代理EntityManager会从当前事务上下文中找到正确的EntityManager,并代理其功能。实际上,我们直接使用的是代理EntityManager,间接使用了Hibernate Session。例如,open-session-in-view和“开启事务”都会在当前线程上下文中设置一个EntityManager,代理EntityManager在执行方法时会找到并调用它。如果当前线程上下文中不存在EntityManager,会报错。

EntityManager内部不一定开启了事务,并且它可能被复用。例如,open-session-in-view中创建的EntityManager就没有开始事务,该EntityManager可能在后续开启事务时被复用,并且在事务结束后也不会被销毁。在没有open-session-in-view的情况下,开启一个新事务就会在当前线程上下文中创建一个新的EntityManager,事务结束后会销毁自身创建的EntityManager。

EntityManager提供的API比Repository灵活,并可以完成所有持久化需求。以下介绍EntityManager中常用的API及其使用上的细节:

persist(Object entity)

必须在事务中调用,大概是一个Save的效果,将对象持久化。参数entity不能是Detached状态(游离态),一般用于新增。不会立即发出insert语句。

merge(Object entity)

必须在事务中调用,大概是一个SaveOrUpdate的效果,会根据参数entity的id立刻做一次select,如果查询到记录,则将entity的属性覆盖上去,不会立即发送update语句。如果没有查询到记录,会新增一个entity,不会立即发送insert语句。返回持久态的entity,该entity可能与传入的参数entity不同。

remove(Object entity)

必须在事务中调用,从数据库中删除,参数entity必须是持久化对象,不会立即发送delete语句。对被remove的entity做修改,无法保存到数据库中。尽量不要修改被remove过的entity。

find(Class entityClass, Object primaryKey)

根据id查找对象

flush()

在事务中调用,会把session中持久化对象的状态同步到数据库中,会在此时发送sql语句到数据库。事务结束前会自动flush。某些查询API在执行前也会自动flush,以保证查询到正确的结果。

public Query createQuery(String qlString)

public TypedQuery createQuery(String qlString, Class resultClass)

执行jpql语句,返回执行结果,执行前会自动调用flush。

public Query createNativeQuery(String sqlString)

public Query createNativeQuery(String sqlString, Class resultClass)

public Query createNativeQuery(String sqlString, String resultSetMapping)

执行原生sql,返回结果,执行前会自动调用flush。

entity的三种状态

瞬时态,直接new出来的,而且没有id。不存在于session中。

游离态,通常是new出来的,不存在于session中。但是有id,并且这个id在数据库中存在。

持久态,通常是orm引擎查询或save update后返回的对象。存在于session中,有id。

由于session(EntityManager)缓存的存在,在事务中,尽可能早地使用持久态对象,可以避免发生一些意外情况。


寿宁县17631383387: jpa entitymanager 怎么获得datasource -
娄农施普: JPA部署方式最为简单,但却最受限制.例如,不能连接到现有的JDBCDataSource, 并且不支持全局事务

寿宁县17631383387: JPA常用的关闭流的方式是什么?事务管理?还是手动关闭? -
娄农施普: JPA关闭流?你说的是数据库连接释放吧?JPA使用的数据库管理对象是EntityManager,手动关闭的话就是entityManager.close();大致的结构如下:EntityManager e=null; EntityTransaction et = e.getTransaction(); et.begin();//你的代码 et.commit(); e.close(); 当然,你还要加入try{}catch{}finally哦.在SSH结构中,一般都采用spring的OpenEntityManagerInViewFilter自动打开和关闭,手动确实容易处理不好有些情况.

寿宁县17631383387: 如何从JPA 2.0 EntityManager获得Hibernate Session -
娄农施普: 1、获得Hibernate Session Session session = entityManager.unwrap(org.hibernate.Session.class);2、获得java.sql.Connection 方法1:JPA 2.0 entityManager.getTransaction().begin(); java.sql.Connection connection = entityManager.unwrap(java....

寿宁县17631383387: 如何通过jpa的entitymanager获取jdbc的connection -
娄农施普: JPA 2.0 entityManager.getTransaction().begin(); java.sql.Connection connection = entityManager.unwrap(java.sql.Connection.class);...entityManager.getTransaction().commit();======================================================...

寿宁县17631383387: 怎样用JPA的EntityManager执行原生sql返回ResultSet - CSDN论坛 -
娄农施普: 试:[java] view plaincopy package com.cndatacom.jpa.test; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.persistence.Query; import ...

寿宁县17631383387: jpa的entityManagerFactory是否就是sessionFactory -
娄农施普: Hibernate 的 JPA 实现可能是对 Hibernate 的 Session 再包装了一下,不过其他的 JPA 实现就不是了,比如:OpenJPA, EclipseLink 等等. EntityManager 并不是单实例的,每调用一次由 EntityManagerFactory 创建一个 EntityManager 对象.用完之后就关闭扔掉,或者是还回到池中去了.

寿宁县17631383387: JPA 如何实现修改一条记录 -
娄农施普: 1.@Test//进行修改操作 public void update1(){//1.加载hibernate 核心配置//2.创建SqlSessionFactory EntityManagerFactory factory = Persistence.createEntityManagerFactory("heiruan");//3.根据工厂创建session EntityManager entityManager = ...

寿宁县17631383387: Spring可选择的事务管理器有哪几种?
娄农施普: JDBC DataSource事物管理器: org.springframework.jdbc.datasource.DataSourceTransactionManagerHibernate的事务管理器: org.springframework.orm.hibernate.HibernateTransactionManagerJDO的事务管理器: org.springframework.orm....

寿宁县17631383387: jpa和hibernate的区别 -
娄农施普: JPA Java Persistence API,是Java EE 5的标准ORM接口,也是ejb3规范的一部分.Hibernate,当今很流行的ORM框架,是JPA的一个实现,但是其功能是JPA的超集.JPA和Hibernate之间的关系,可以简单的理解为JPA是标准接口,...

寿宁县17631383387: Struts2 Spring JPA 整合时报错:No bean named 'entityManagerFactory' is defined ,请问各位是怎么解决 -
娄农施普: 你的Spring的配置文件中是不是有下面这段配置呢? class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">ref="dataSource" /> -->如果有的话,看下jar包是否缺少了.看下这个4个是不是有的 spring-orm-3.0.5.RELEASE.jar spring-jdbc-3.0.5.RELEASE.jar hibernate-jpa-2.0-api-1.0.1.Final.jar hibernate-entitymanager-3.6.0.Final.jar

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网