`
huttoncs
  • 浏览: 199130 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Hibernate,JPA对象关联关系映射

    博客分类:
  • jpa
 
阅读更多


 关联关系映射,是映射关系中比较复杂的一种映射关系,总的说来有一对一、一对多和多对多几种关系。细分起来他们又有单向和双向之分。下面我们逐一介绍一下。

单向 OneToOne

单向一对一是关联关系映射中最简单的一种,简单地说就是可以从关联的一方去查询另一方,却不能反向查询。我们用下面的例子来举例说明,清单 1 中的 Person 实体类和清单 2 中的 Address 类就是这种单向的一对一关系,我们可以查询一个 Person 的对应的 Address 的内容,但是我们却不能由一个 Address 的值去查询这个值对应的 Person。

清单 1. 单向一对一关系的拥有端

 @Entity 
 public class Person implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    private String name; 
    private int age; 
    @OneToOne 
 private Address address; 

 //   Getters & Setters 
 } 

清单 2. 单向一对一关系的反端

 

 @Entity 
 public class Address implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    private String street; 
    private String city; 
 private String country; 
 // Gettes& Setters 
 } 

图 1. 单向一对一关系对应的 ER 图



 从图 1 他们的 ER 图上可以看出,这种单向的一对一关系在数据库中是以外键的形式被映射的。其中关系的发出端存储一个指向关系的接收端的一个外键。在这个例子中 Person 表中的 ADDRESS_ID 就是指向 address 标的一个外键,缺省情况下这个外键的字段名称,是以它指向的表的名称加下划线“_”加“ID”组成的。当然我们也可以根据我们的喜好来修改这个字段,修改的办法就是使用 @JoinColumn 这个注解。在这个例子中我们可以将这个注解注释在 Person 类中的 Address 属性上去。

 

双向 OneToOne

双向关系有一方为关系的拥有端,另一方是关系的反端,也就是“Inverse”端。在这里例子中 Person 拥有这个关系,而 Address 就是关系的“Inverse”端。Address 中我们定义了一个 person 属性,在这个属性上我们使用了 @OneToOne 注解并且定义了他的“mappedBy”属性,这个在双向关系的“Inverse”端是必需的,在下面将要介绍的双向关系中也要用到这个属性。

清单 3. 双向一对一关系中的接受端

 @Entity 
 public class Address implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    private String street; 
    private String city; 
 private String country; 
 @OneToOne(mappedBy = "address") 
 private Person person; 
 // Gettes& Setters 

 } 

单向 OneToMany

单向关系的一对多我们可以用清单 4 和清单 5 来说明。在关系的发出端 Person 中我们使用 OneToMany 这个注解对 cellPhones 这个属性进行了注释,cellPhones 中存储的是 CellPhone 的一个 List 对象,JPA 就是用这种方式实现一对多的。

清单 4. 单向一对多关系的发出端

 public class Person implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    private String name; 
    private int age; 
    @OneToMany 
    private List<CellPhone> cellPhones; 
    // Getters and Setters 
 } 

清单 5. 单向一对多关系的接收端

 @Entity 
 public class CellPhone implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    private String manufacture; 
    private String color; 
    private Long  phoneNo; 
    // Getters and Setters 
 } 
图 2. 单向一对多关系对应的 ER 图


 在一对多关联关系映射中,默认是以中间表的方式来映射这种关系的。如在本例中,中间表为 person_cellphone,表的名称为关系的拥有端和 Inverse 端中间用下划线连接。中间表的字两个字段分别为两张表的得表名加下划线“_”加 ID 组成。当然我们也可以改表这种默认的中间表的映射方式,我们可以在关系的拥有端使用 @JoinClolum 来使用外键的方式映射这个关系。



双向 OneToMany

清单 6. 双向一对多关系的接受端

 @Entity 
 public class Person implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    private String name; 
    private int age; 
  
    @OneToMany(mappedBy = "person") 
    private List<CellPhone> cellPhones; 
    // Getters and Setters 
 } 

清单 7. 双向一对多关系的发出端

 @Entity 
 public class CellPhone implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    
    private String manufacture; 
    private String color; 
    private Long  phoneNo; 
    @ManyToOne 
    private Person person; 
    // Getters and Setters 
 } 
图 3. 双向一对多关系对应的 ER 图



 

单向 ManyToMany

多对多关联关系中只能通过中间表的方式进行映射。本例的单向多对多关系如下所示。

在清单 8 中我们使用了 ManyToMany 这个注解来对 Teacher 中的 Students 进行注释,其中 Teacher 就是关系的发出端。而在 Student 中我们并没有作任何定义,这是单向多对多的所要求的。

清单 8. 单向多对多关系的发出端

 @Entity 
 public class Teacher implements Serializable { 
   
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    private String name; 
    private Boolean gender; 
    private int age; 
    private int height; 
    @ManyToMany 
 private List<Student> students; 
 // Getters  and  Setters 
 } 

清单 9. 单向多对多关系的反端

 @Entity 
 public class Student implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    private String name; 
    private Boolean gender; 
    private int age; 
    private int height; 
   //Getters  and  Setters 
 } 

图 4. Teacher 对应得数据库表



 图 5. Students 对应得数据库表

 图 6. 中间生成表



 

双向 ManyToMany

清单 10. 双向多对多关系的拥有端

 @Entity 
 public class Teacher implements Serializable { 
   
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    private String name; 
    private Boolean gender; 
    private int age; 
    private int height; 
    @ManyToMany 
 private List<Student> students; 
 // Getters  and  Setters 
 } 

清单 11. 双向多对多关系的反端

 @Entity 
 public class Student implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    private String name; 
    private Boolean gender; 
    private int age; 
    private int height; 
    @ManyToMany(mappedBy = "students") 
    private List<Teacher> teachers; 
    //Getters  and  Setters 
 } 

图 7. 双向多对多关系对应的 ER 图



 

  • 大小: 28 KB
  • 大小: 20.7 KB
  • 大小: 27 KB
  • 大小: 10.4 KB
  • 大小: 7 KB
  • 大小: 4.7 KB
  • 大小: 25.9 KB
分享到:
评论

相关推荐

    JPA学习笔记-EJB-04JPA关联映射总结

    感觉JPA关联映射实现感觉比Hibernate配置文件的关联映射几乎一样,只是引入了“零配置”这个概念。劣者自己在做一个东西的时候用到了关联映射,在此将它做一个总结。留给自己回顾用。

    Hibernate数据持久层框架.rar

    是一款持久层框架,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。JPA的对象关系映射(ORM)模型是基于Hibernate。是一款面向对象的ORM框架,JPA不...

    hibernate_sample:Hibernate JPA示例

    ORM是对象关系映射的缩写,它将Java世界中的对象与关系数据库世界中的记录相关联。 Hibernate是开源的。它在以下站点上发布。 Hibernate和JPA JPA(Java持久性API)作为处理关系数据库的框架存在于Java EE中。 ...

    hibernate核心,一对多,多对多映射讲解,看了就完全搞明白了

    hibernate核心,一对多,多对多映射讲解,看了就完全搞明白了

    Hibernate实战(第2版 中文高清版)

     第7章 高级实体关联映射   7.1 单值的实体关联   7.1.1 共享的主键关联   7.1.2 一对一的外键关联   7.1.3 用联结表映射   7.2 多值的实体关联   7.2.1 一对多关联   7.2.2 多对多关联   7.2.3 把...

    Spring Boot Jpa.docx

    它为 Java 开发人员提供了一种对象/关联映射工具来管理 Java 应用中的关系数据。它的出现主要是为了简化现有的持久化开发工作和整合 ORM 技术,结束现在 Hibernate,TopLink,JDO 等 ORM 框架各自为营的局面。 值得...

    Pro JPA 2 Mastering the Java Persistence API free down

    JPA2.0 加入了大量必须的 ORM 映射增强特性,包括:支持通过使用 @ElementCollection 标注来增强 collections, maps 和 lists( 这里不是指实体之间的关联关系 ) 集合,支持 map 的单向 one-to-many 关联 (JPA1.0...

    Hibernate_JPA

    关于Hibernate的基本知识,有关关联映射,二级缓存,一对多,多对一,HQL查询等等.

    spring-jpa-hibernate:使用Spring Data JPA和Hibernate作为JPA提供者的示例应用程序

    示例应用程序演示了如何将Hibernate用作Spring Data JPA的JPA提供程序。 当前演示了以下概念: 概念 描述 看 Spring Data JPA存储库 使用再次执行操作关系数据库 直接EntityManager访问 直接访问JPA ...

    Hibernate注释大全收藏

    在特定的实体关联属性上使用 @Embeddable 和 @AttributeOverride 注解可以覆盖该属性对应的嵌入式对象的列映射。 @Entity public class Person implements Serializable { // Persistent component using defaults...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    10.1.1 对象/关系数据库映射(ORM) 365 10.1.2 JPA的映射规则 367 10.1.3 JPA规范简介 368 10.2 实体入门 368 10.2.1 开发实体 369 10.2.2 在Java SE环境下使用 Hibernate JPA实现 370 10.2.3 在Java SE环境下使用 ...

    Hibernate注解

    * 9.increnment 插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法。 * 例:@GeneratedValue(generator = ...

    全面掌握 Hibernate 框架技术

    全面包含Hibernate相关技术,老司机手把手带你一起飞,让你少走弯路。 包含Hibernate相关技术: ...组件映射、继承映射、缓存、JPA 反向工程、封装GenericDao 教学全程采用笔记+代码案例的形式讲解,通俗易懂!!!

    jpa-workshop:在我的 JPAHibernate 研讨会中使用的一系列示例

    我用来运行 JPA/Hibernate 研讨会的点点滴滴。 代码使用 maven 和 Spring 来运行示例映射 锡罐中包含什么? 没什么太狂野的 一对一 一对多/多对一 多对多 嵌入式 辅助表 遗产 懒惰抓取 查询 JPQL 命名查询 Spring...

    bookManager:用于Spring Boot的Book Manager一对多关系项目

    一对多双向关系映射带有Spring Boot的Java Web Services和RESTful API 本教程将引导您完成使用Spring Boot,Spring Data JPA,Lombok,H2和Swagger映射JPA / Hibernate一对多双向关系的步骤。 下表关系图说明了此...

    Spring面试题

    类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、 4. 说下Hibernate的缓存...

    Hibernate实战

    本课程讲述Java ORM框架Hibernate,内容包括:环境配置、Hibernate架构、SessionFactory、Session、映射文件、基于注解的配置、JPA、HQL查询、Criteria查询、关联映射、缓存、正逆向工程。

    Hibernate-通过联接表进行多对多映射

    使用MySQL和Spring详细描述Hibernate有多对多关联

    java文集

    Java正则表达式 批量上传--采集 (多个文件夹) The Agile Way hibernate mapping文件中的标记详解:关系标记 ANT 安装使用及build.xml文档模板 inverse和cascade在关联更新中的作用 hibernate ...

    Struts2 in action中文版

    第9章 集成Spring和Hibernate/JPA 196 9.1 为什么在Struts 2中使用Spring 196 9.1.1 依赖注入能做些什么 197 9.1.2 Spring如何管理对象和注入依赖 199 9.1.3 使用接口隐藏实现 200 9.2 将Spring添加到Struts 2 202 ...

Global site tag (gtag.js) - Google Analytics