JPA(Java Persistence API, java 持久化api).JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
JPA维护一个Persistence Context(持久化上下文),在持久化上下文中维护实体的生命周期。主要包含三个方面的内容:
-
ORM(Object-Relation-Mapping即对象关系影射技术)元数据。JPA支持annotion或xml两种形式描述对象-关系映射。
-
实体操作API。实现对实体对象的CRUD操作。
-
查询语言。约定了面向对象的查询语言JPQL(Java Persistence Query Language)
-
New,新创建的实体对象,没有主键(identity)值
-
Managed,对象处于Persistence Context(持久化上下文)中,被EntityManager管理
-
Detached,对象已经游离到Persistence Context之外,进入Application Domain
-
Removed, 实体对象被删除
-
persist, 将新创建的或已删除的实体转变为Managed状态,数据存入数据库。
-
remove,删除受控实体
-
merge,将游离实体转变为Managed状态,数据存入数据库。
实体关系映射
1 id生成策略:
a:GeneratorType.AUTO ,由JPA自动生成
b:GenerationType.IDENTITY,使用数据库的自增长字段,需要数据库的支持(如SQL Server、MySQL、DB2、Derby等)
c:GenerationType.SEQUENCE,使用数据库的序列号,需要数据库的支持(如Oracle)
d:GenerationType.TABLE,使用指定的数据库表记录ID的增长 需要定义一个TableGenerator,在@GeneratedValue中引用。例如:
-
@TableGenerator( name="myGenerator", table="GENERATOR table", pkColumnName = "ENTITY name", pkColumnValue="MyEntity",
valueColumnName = "PKvalue", allocationSize=1 ) -
@GeneratedValue(strategy = GenerationType.TABLE,generator="myGenerator")
2 关系映射
JPA定义了one-to-one、one-to-many、many-to-one、many-to-many 4种关系
查询
JPA提供两种查询方式,一种是根据主键查询,使用EntityManager的find方法:T find(Class entityClass, Object primaryKey)
另一种就是使用JPQL查询语言。JPQL是完全面向对象的,具备继承、多态和关联等特性,和hibernate HQL很相似。
使用EntityManager的createQuery方法:Query createQuery(String ql)
JPQL
1使用参数:
可以在JPQL语句中使用参数。JPQL支持命名参数和位置参数两种参数,但是在一条JPQL语句中所有的参数只能使用同一种类型。
举例如下:
命名参数:Query query = e.createQuery("select e from Entity e where e.id=:Id"); query.setParameter("Id",new Integer(1));
位置参数:Query query = e.createQuery("select e from Entity e where e.id=?1"); query.setParameter(1,new Integer(1));
2 命名查询:
如果某个JPQL语句需要在多个地方使用,还可以使用@NamedQuery 或者 @NamedQueries在实体对象上预定义命名查询。
在需要调用的地方只要引用该查询的名字即可。
例如:
@NamedQuery(name="getEntity", query= "FROM Entity WHERE id=?1")
@NamedQueries({ @NamedQuery(name="getPerson1", query= "FROM Entity WHERE id=?1"), @NamedQuery(name="getPersonList", query= "FROM Entity WHERE age>?1") })
Query query = em.createNamedQuery("getEntity");
3 排序:
JPQL也支持排序,类似于SQL中的语法。例如: Query query = em.createQuery("select e from Entity e order by e.age, e.birthday desc");
4 聚合查询:
JPQL支持AVG、SUM、COUNT、MAX、MIN五个聚合函数。例如:
Query query = em.createQuery("select max(e.age) from Entity e"); Object result = query.getSingleResult(); String maxAge = result.toString();
5 更新和删除:
JPQL不仅用于查询,还可以用于批量更新和删除。如:
Query query = em.createQuery("update Order as o set o.amount=o.amount+10"); //update 的记录数 int result = query.executeUpdate();
Query query = em.createQuery("delete from OrderItem item where item.order in(from Order as o where o.amount<100)"); query.executeUpdate();
query = em.createQuery("delete from Order as o where o.amount<100"); query.executeUpdate();//delete的记录数