扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
下面的表列出了EntityManager接口的一些重要方法,这些方法用于进行实体操作。
方法 | 目的 |
public void persist(Object entity); | 持久化一个实体的实例 |
public |
合并一个detached实体 |
public void remove(Object entity); | 删除实体的实例 |
public |
通过主键获取实体的实例 |
public void flush(); | 将实体的状态与数据库同步 |
可以使用persist()方法来持久化一个实体的实例。例如,如果想要持久化Contractor的一个实例,使用以下的代码:
@PersistenceContext(unitName="onjava") private EntityManager em; ... Contractor pte = new Contractor(); pte.setName("Nistha") pte.setHourlyRate(new Double(100.0)); em.persist(pte); |
如果持久化了一个实体,并且实体上的关系的CascadeType被设置为PERSIST或者是ALL的话,那么任何和该实体关联的实体的状态变化都会被持久化。除非你使用一个扩展的持久化上下文,否则的话,实体在事务结束以后就会变成detached状态。merge操作允许你使用一个持久化上下文将一个detached实体存储到数据库中,这个detached实体的状态将会和数据库同步。这可以使你摆脱在EJB 2.x 时代普遍使用的DTO这种反模式,因为现在实体都是POJO,可以在各个层之间传递。对于实体类的唯一要求就是要实现java.io.Serializable接口。
查询API
持久化的另一个重要问题就是实体的获取。当使用EJB3 JPA时,查询使用java 持久化查询语言来表达。JPQL是EJB QL(EJB2.0中引入)的一个扩展。但是,EJB3 JPA,解决了EJB QL的一些限制并且增加了新的功能,使之成为一个强大的查询语言。
JPQL对于EJBQL 2.x的增强
以下是JPQL的一些新功能:
而且,你可以使用native SQL来查询实体如果你需要特定的数据库查询扩展的话。
动态查询 vs. 命名查询
你可以使用动态查询或者命名查询。一个命名查询和实体存储在一起,并且可以在程序中重复使用。
为了创建一个动态查询,使用entity manager接口的createQuery方法,如下:
Query query = em.createQuery( "select e from Employee e where e.empNo > ?1"); query.setParameter(1,100); return query.getResultList(); |
如果想要使用命名查询来进行这个查询,在实体类中使用NamedQuery标注,如下:
@Entity @NamedQuery(name="findAllEmployee", query="select e from Employee e where e.empNo > ?1") public abstract class Employee implements Serializable { } |
为了执行一个命名查询,首先使用EntityManager接口的createNamedQuery方法来创建一个Query实例,如下:
query = em.createNamedQuery(" findAllEmployee"); query.setParameter(1,100); return query.getResultList(); |
命名参数
你可以在EJBQL中使用命名参数来代替位置参数,例如,你可以使用如下方法来改写上面的查询:
"select e from Employee e where e.empNo > :empNo " |
如果在查询中使用命名参数,你必须使用如下的方法来设置参数:
query = em.createNamedQuery("findAllEmployee"); query.setParameter("empNo",100); return query.getResultList(); |
打包
EJB3 JPA标准化了POJO的持久化操作。因此,实体并不限于EJB模块,它们可以打包在一个Web模块中,一个ejb-jar模块,EAR级别的类模块,或者一个标准的Jar文件中。你也可以在J2SE环境中使用实体。你必须将一个部署描述符文件(在persistence.xml)打包进去。
<persistence> <persistence-unit name="onjava"> <provider>oracle.toplink.essentials.PersistenceProvider</provider> <jta-data-source>jdbc/OracleDS</jta-data-source> ... </persistence-unit> </persistence> |
这个部署描述符确定了持久化提供者,持久化单元以及持久化单元使用的数据源。顾名思义,一个持久化单元就是需要一起管理的一组实体。如果你在一个特定的模块中定义了唯一一个持久化单元,你就不需要在persistence.xml中定义实体类,持久化提供者会自动找到实体类。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者