欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

JPA在hibernate中的使用,JPAhibernate使用

来源: javaer 分享于  点击 35865 次 点评:35

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配置文件使用,即零配置开发,这也是我所推崇的一种 开发方式,当然也有相当一部分的同志和公司仍然坚持使用配置文件,理由也各种各样。就我在公司的实际开发情况看来,大部份 同事是因为感觉注解配置很难,不愿意去学习,其实一旦熟悉是注解的用户,使用是相当简单的。

相关文章

    暂无相关文章
相关栏目:

用户点评