作为 Java 企业版 5 (Java EE 5) Enterprise Java Bean (EJB) 3.0 规范的组成部分,Java 持续性 API (JPA) 显著简化了 EJB 持续性并提供了一个对象关系映射方法,该方法使您可以采用声明方式定义如何通过一种标准的可移植方式(在 Java EE 5 应用服务器内部以及 Java 标准版 (Java SE) 5 应用程序中的 EJB 容器外部均可使用)将 Java 对象映射到关系数据库表。
在 JPA 之前,Java EE 应用程序将持续类表示为容器管理的实体 bean。使用 JPA,您可以将任何普通的旧式 Java 对象 (POJO) 类指定为 JPA 实体:一个应使用 JPA 持续性提供程序的服务将其非临时字段持久保存到关系数据库(在 Java EE EJB 容器的内部或在简单 Java SE 应用程序中的 EJB 容器的外部)的 Java 对象。
使用 JPA 时,可以使用批注配置实体的 JPA 行为。批注是一种使用元数据修饰 Java 源代码的简单表达方法,它编译为相应的 Java 类文件,以便在运行时由 JPA 持续性提供程序解释以管理 JPA 行为。(以上段落来自ORACLE)
此篇文章我们假设大家已经对Hibernate非常熟悉了,并且能够熟练应用xml配置文件来开发项目,这里我不对hibernate的配置及原理进行讲解。
下面看看我的示例程,该片段程序来自我在公司给同事培训时的代码。
一、使用到的JAR包
二、让Hibernate支持JPA
我们需要重写hibernate的SessionFactory类,更改configuration的实例化方化方式为AnnotationConfiguration,即注解配置方式。示例代码如下:
Configuration configuration = new AnnotationConfiguration();
这样实例化configuration之后,我们还要考虑POJO类的加载方式,一般有两种,在配置文件中加载或者在类中加载,我个人推荐在类中加载,因为我们提倡零配置开发。
在hibernate.cfg.xml配置文件中加载:
<mapping class="com.lishengbo.pojo.Students" />
<mapping class="com.lishengbo.pojo.Book"/>
<mapping class="com.lishengbo.pojo.Teacher"/>
<mapping class="com.lishengbo.pojo.Wife"/>
<mapping class="com.lishengbo.pojo.Hubby"/>
在类中加载:
Configuration configuration = new AnnotationConfiguration();
configuration configure(ServiceModule.class.getResource("/hibernate.cfg.xml"));
//添加一个pojo类
configuration .addAnnotatedClass(User.class);
三、一对一关系映射
编写
POJO类(Hubby)
@Entity
@Table(name = "hubby")
public class Hubby {
……………..
@OneToOne(mappedBy="hubby",optional=true,cascade=CascadeType.ALL)
public Wife getWife() {
return wife;
}
…………..
}
编写wife类
@Entity
@Table(name = "wife")
public class Wife {
@OneToOne(optional=false,targetEntity=Hubby.class,cascade=CascadeType.ALL)
@JoinColumn(name = "hu_id", unique = true, referencedColumnName="hu_id", nullable = false, updatable = false)
public Hubby getHubby() {
return hubby;
}
}
四、双向一对多、多对一关系映射
一对多关系是数据库中最常用到的关系,为了满足第三范式,通用我们会在“多”的一方设计一个外键,用来引用“一”的一方的主键。
首先我们来看一下学生表与书籍表的关系
编写students类
@Entity
@Table(name="student1")
public class Students{
@OneToMany(mappedBy="student",cascade=CascadeType.ALL,fetch=FetchType.EAGER,targetEntity=Book.class)
public List<Book> getBook() {
return book;
}
}
编写book类
@Entity
@Table(name = "book")
public class Book{
@ManyToOne(cascade=CascadeType.MERGE)
@JoinColumn(name="sid")
public Students getStudent() {
return student1;
}
}
五、多对多关系映射
在设计多对多关系的数据表时,通常有一张中间表。
学生与老师是多对多的关系,一个学生可以有多个老师,一个老师同样也可以有多个学生。
编写 Teacher类
@Entity
@Table(name = "teacher")
public class Teacher {
@ManyToMany(mappedBy="teacherList",cascade=CascadeType.REFRESH)
public List<Students> getStudentList() {
return studentList;
}
}
在Students类中加入如下代码
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name = "teacher_student", joinColumns = @JoinColumn(name = "st_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "th_id", referencedColumnName = "id"))
public List<Teacher> getTeacherList() {
return teacherList;
}
六、常用JPA的说明
本文只涉级最基本的JPA使用,更多的JPA请参考Oracle的官方文档
九、对于使用注解配置的思考
早在08年的时候,我们就已经在使用注解来开发系统,慢慢的淘汰XML配置文件使用,即零配置开发,这也是我所推崇的一种
开发方式,当然也有相当一部分的同志和公司仍然坚持使用配置文件,理由也各种各样。就我在公司的实际开发情况看来,大部份
同事是因为感觉注解配置很难,不愿意去学习,其实一旦熟悉是注解的用户,使用是相当简单的。
所有评论(0)