JPA在hibernate中的使用

    

       作为 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配置文件使用,即零配置开发,这也是我所推崇的一种
开发方式,当然也有相当一部分的同志和公司仍然坚持使用配置文件,理由也各种各样。就我在公司的实际开发情况看来,大部份
同事是因为感觉注解配置很难,不愿意去学习,其实一旦熟悉是注解的用户,使用是相当简单的。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
JPAJava Persistence API)和Hibernate是两种在Java平台上用于对象关系映射(ORM)的技术。 JPAJava EE规范定义的一套ORM接口,它为开发人员提供了一种标准的方式来访问持久化数据。而Hibernate是一个实现了JPA规范的ORM框架,它提供了强大的对象关系映射功能以及其他与持久化相关的特性。 以下是JPAHibernate之间的一些区别: 1. 概念层面:JPA是一种规范,而Hibernate是实现该规范的一个框架。 2. 灵活性:JPA是一种标准化的接口,允许开发人员在不同的JPA实现之间进行切换。因此,使用JPA可以更容易地切换到其他ORM框架,而不仅仅局限于Hibernate。 3. 学习曲线:由于JPA是一个较为抽象的接口,学习和使用JPA可能需要更多时间和学习成本。相比之下,Hibernate提供了更具体和易于理解的API,并且有更多的文档和教程可供参考。 4. 生态系统:Hibernate是一个成熟且广泛使用的ORM框架,拥有强大的社区支持和丰富的生态系统。它提供了丰富的功能和性能优化选项。虽然JPA也有一些实现,但Hibernate被认为是JPA最常用和最流行的实现之一。 总结起来,JPAJava EE规范定义的一套ORM接口,而Hibernate是一个实现了JPA规范的强大ORM框架。通过使用JPA,开发人员可以获得更高的灵活性和可移植性,而Hibernate则提供了更具体和易于使用的API以及丰富的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lishengbo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值