JPA(Java Persistence API)目前使用范围范围越来越广,作为J2EE平台提供的ORM规范,得到了很多开源框架的支持,JPA可以脱离容器独立运行,方便开发和测试,下面我们通过实例来说明如何在Hibernate中使用JPA来简化编程的。
JPA作为一种规范存在,就相当于一个接口,而Hibernate就来实现这个接口,对JPA的实现需要三个组件支持:
hibernate-annotation是Hibernate支持annotation方式配置的基础,包括了标准的JPA annotation以及Hibernate自身特殊功能的annotation。
hibernate-core是Hibernate的核心实现,提供了Hibernate所有的核心功能
hibernate-entitymanager可以看做是hibernate-core和JPA之间的桥梁,它对hibernate-core进行封装,使得hibernate符合JPA的规范。
应用JPA项目,我们也离不开JPA所依赖的包:
hibernate-annotations.jar
ejb3-persistence.jar
hibernate-commons-annotations.jar
当然在Hibernate的框架中我们不需要映射文件,只需要在Hibernate的配置文件中采用类名的方式去映射即可:
<mappingclass="com.bjpowernode.hibernate.User"/>
在实体中我们就要采用注解的方式完成映射了:
package com.bjpowernode.hibernate;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class User {
@Id
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
在解析配置文件的时候,我们使用AnnotationConfiguration()方法完成,解析加入注解的相关主键
Configuration cfg = newAnnotationConfiguration().configure();
其中采用注解的方式将实体映射到配置文件中,下面就是几种常用的注解:
1、对实体类整体的映射:
@Entity
@Table(name="t_user1")
表示实体在数据库中映射的表名为t_user1。
2、对主键的映射:
@Id
@GeneratedValue表示数据库采用自增长的方式生成主键
@GenericGenerator(name="myIdGenerator",strategy="uuid")表示主键的生成策略为uuid。
3、对字段名称的映射:
@Column(name="create_time")表示列的字段名称为create_time。
4、继承中的映射:
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)指定为继承映射,每个继承树一张表
@DiscriminatorColumn(name="type",discriminatorType=DiscriminatorType.STRING)鉴别字段
@DiscriminatorValue(value="P")鉴别值是P
@Inheritance(strategy=InheritanceType.JOINED)//指定为继承映射,每个类一张表
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)//指定为继承映射,每个具体类一张表
5、多对多的关联映射:
@ManyToMany(mappedBy="roles")映射
@ManyToMany
@JoinTable(
name="t_user_role",
joinColumns={@JoinColumn(name="user_id")},
inverseJoinColumns={@JoinColumn(name="role_id")}
)指定第三方表名称
(mappedBy出现在哪一端,哪一端不维护关系,它成为了关系的被管理端。相当于hibernate中的inverse=true。)
6、多对一的关联映射:
@ManyToOne多对一的映射
7、一对多的关联映射:
@OneToMany(mappedBy="classes",targetEntity=Student.class)
JPA是JCP组织发布的 Java EE标准之一,框架中支持大数据集、事务、并发等容器级事务,
提供了更加简单的编程模型。JPA的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句,与Hibernate中的hql非常类似,同样也支持面向对象中的继承和多态特性,能够让开发者最大限度的使用面向对象的模型设计企业应用,而不需要自行处理这些特性在关系数据库的持久化。由此Hibernate中应用JPA是必然的趋势。