JPA在hibernate中的使用,JPAhibernate使用
JPA在hibernate中的使用,JPAhibernate使用
作为 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的官方文档 @Table 对象与表映射 @Entity 代表一个实体 @Column(name=“...”) 该属性对应表中的字段是什么,没有name表示一样 @OneToOne:一对一映射。它包含五个属性:
targetEntity:关联的目标类
Cascade:持久化时的级联操作,默认没有
fetch:获取对象的方式,默认EAGER
Optional:目标对象是否允许为null,默认允许
mappedBy:定义双向关联中的从属类。 @JoinColumn:定义外键(主表会多一字段,做外键) @OneToMany 默认情况下,JPA 为具有一对多多重性的多值关联定义一个 OneToMany 映射。 使用 @OneToMany 批注: 将获取类型配置为 LAZY 由于所使用的 Collection 不是使用一般参数定义的,因此配置关联的目标实体 配置必须层叠到关联目标的操作:例如,如果删除了拥有实体,则确保还删除关联的目标 默认情况下,JPA 为指向具有多对一多重性的其他实体类的单值关联自动定义一个 ManyToOne 映射。 使用 @ManyToOne 批注: 将获取类型配置为 LAZY 如果空值不适合于应用程序,则将映射配置为禁止空值(针对非基元类型) 配置关联的目标实体(如果无法从被引用的对象类型推断出它) 配置必须层叠到关联目标的操作:例如,如果删除了拥有实体,则确保还删除关联的目标 @ManyToMany 默认情况下,JPA 为具有多对多多重性的为多值关联自动定义一个 @ManyToMany 映射。 使用 @ManyToMany 批注: 将获取类型配置为 LAZY 如果空值不适合于应用程序,则将映射配置为禁止空值(针对非基元类型) 由于所使用的 Collection 不是使用一般参数定义的,因此配置关联的目标实体 配置必须层叠到关联目标的操作:例如,如果删除了拥有实体,则确保还删除关联的目标 joinColumns 默认情况下,JPA 持续性提供程序假设:拥有实体的每个主键列都有一个连接列。 inverseJoinColumns 默认情况下,JPA 持续性提供程序假设关联的被拥有方(或另一方)上有一个连接列:被拥有实体的主键列 。 八、关于Hibernate+JPA与其他框架的整合 要与MVC框架和IOC之类的框架整合,以上介绍的代码是无法满足的,我们需要对代码做进一步的封装处理,本文暂时不讨论。 我将会在以后的文章中相继推出框架整合的文章。 九、对于使用注解配置的思考 早在08年的时候,我们就已经在使用注解来开发系统,慢慢的淘汰XML配置文件使用,即零配置开发,这也是我所推崇的一种 开发方式,当然也有相当一部分的同志和公司仍然坚持使用配置文件,理由也各种各样。就我在公司的实际开发情况看来,大部份 同事是因为感觉注解配置很难,不愿意去学习,其实一旦熟悉是注解的用户,使用是相当简单的。
相关文章
- 暂无相关文章
用户点评