6.关系映射(使用注解的方式表示)

写在前面

  这里的关系是指:对象之间的关系,并不是数据库的关系

  如:关系有单向和双向之分,但是在数据库中,单向关系和双向关系其实并没有什么区别,

    这里的单双向指的是对象之间是否能够相互访问

铁律: 1、凡是双向关联,必设mappedBy

    因为根本都没必要在2个表中都存在一个外键关联,在数据库中只要定义一遍就可以了

    mappedBy的意思就是“被映射”,即mappedBy这方不用管关联关系(即不生成外键字段),关联关系交给另一方处理
     2、双向关系在程序中要设定双向关联

存在以下关联关系

  1.一对一

    有两种策略可以实现一对一的关联映射:

    1.主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系;

    数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联

    2.唯一外键关联:外键关联,本来是用于多对一的配置,

    但是如果加上唯一的限制之后,也可以用来表示一对一关联关系

  唯一外键关联(单向)

    @OneToOne 写在被引用对象的实体类中

    @JoinColum 为数据库表中这个外键指定个字段名称

 1 @Entity
 2 public class Husband {
 3     private int id;
 4     private String name;
 5     private Wife wife;
 6
 7     @OneToOne
 8     @JoinColumn(name="wifeID")
 9     public Wife getWife() {
10         return wife;
11     }
12     public void setWife(Wife wife) {
13         this.wife = wife;
14     }
15     @Id
16     @GeneratedValue(strategy=GenerationType.AUTO)
17     public int getId() {
18         return id;
19     }
20     public void setId(int id) {
21         this.id = id;
22     }
23     public String getName() {
24         return name;
25     }
26     public void setName(String name) {
27         this.name = name;
28     }
29 }

  唯一外键关联(双向)

  mappedBy作用

  是指定这个一对一关联是被Husband类的 wife属性(准确说是getWife方法)做的映射

  Wife这边不生成外键字段,而是交给 Husband去生成外键字段

 1 @Entity
 2 public class Wife {
 3     private int id;
 4     private String name;
 5     private Husband husband;
 6     @OneToOne(mappedBy="wife")
 7     public Husband getHusband() {
 8         return husband;
 9     }
10     public void setHusband(Husband husband) {
11         this.husband = husband;
12     }

  主键关联(单向)

     @PrimaryKeyJoinColumn

  主键关联(双向)

      mappedBy

  

  联合主键关联(参考的那张表的主键不唯一时 会使用到) 

    @JoinColumns

    注解联合主键一对一联系,然后再使用@JoinColumn 来注解当前表中的外键字段名,

    并指定关联哪个字段,使用referencedColumnName指定哪个字段的名称

 1 @OneToOne
 2     @JoinColumns(
 3             {
 4                 @JoinColumn(name="wifeId", referencedColumnName="id"),
 5                 @JoinColumn(name="wifeName", referencedColumnName="name")
 6             }
 7     )
 8     public Wife getWife() {
 9         return wife;
10     }

    

  

  2.多对一

    @ManyToOne

  3.一对多

    @OneToMany

  4.多对多

    @ManyToMany

  

 1 @ManyToMany
 2     @JoinTable(name="t_s",
 3     joinColumns={@JoinColumn(name="teacher_id")},  //会自动参考teahcer的 ID
 4     inverseJoinColumns={@JoinColumn(name="student_id")}  //会自动参考student的 ID
 5     )
 6     public Set<Student> getStudents() {
 7         return students;
 8     }
 9     public void setStudents(Set<Student> students) {
10         this.students = students;
11     }

注:关联关系中的CRUD_Cascade_Fetch

@OneToMany
(mappedBy="group",
cascade={CascadeType.ALL},fetch=FetchType.EAGER
)

1.设定cascade 可以设定在持久化时对于关联关系对象的操作(级联更新)(CUD ,R归Fetch管)

2.cascade仅仅是帮助我们省了编程的麻烦而已,不要把它的作用看的太大

3.fetch(FetchType.EAGER,(会被关联自动查询出来)FetchType.Lazy(不会自动关联查询出来,用到的时候才会去查询))

  如老师里面有 学生集合,当老师被查询时,这个老师的学生集合被直接加载出来,不管是否学生有没有用到   EAGER

  学生集合不会被直接加载,而是等到需要用到学生的时候,才会去加载学生集合   Lazy

  a) 铁律:双向不要两边设置Eager  (会有多余的查询语句发出)

  b) 对多方设置fetch的时候要谨慎,结合具体应用,一般用Lazy 不用 eager,

   特殊情况(多方数量不多的可以考虑,提高效率时可以考虑)

4.如果想消除关联关系,先设定关系为null,再删除对应记录(如果不设定为null,就会级联删除),

 如果不删除记录,该记录就变成垃圾数据

  5.集合映射

    1.Set

    2.List

      a) @OrderBy("name ASC")

      //使用 @OrderBy注解List中使用哪个字段进行排序,可以组合排序,中间使用逗号分开

    3.Map  

      a) @MapKey(name="id")   //注解使用哪个字段为key

  6.继承关系(不重要)

    使用@Inheritance 注解为继承映射,再使用strategy属性来指定继承映射的方式

    strategy有三个值:InheritanceType.SINGLE_TABLE      单表继承

               InheritanceType.TABLE_PER_CLASS   类表继承

               InheritanceType.JOINED            具体表继承

a)单表继承            SINGLE_TABLE
    把所有的属性都存储到一个表中,另外需要加入一个标识字段(表示哪个具体的子类)
    使用@DiscriminatorColumn   标识字段的字段名,及字段类型
    使用@DiscriminatorValue      来注解标识字段的值

b)类表继承   TABLE_PER_CLASS
    每个具体类 映射成一个表  ,子类之间的ID不能重复
    @TableGenerator来申明一个表主键生成策略
    @GeneratedValue(generator="t_gen", strategy=GenerationType.TABLE)来注解生成策略为表生成策略,并且指定表生成策略的名称

 c)具体表继承   JOINED
    每个类 映射成一个表  父类中包含了子类公共的一些字段,父类中一个ID对应一个子类
    只需要设置@Inheritance(strategy=InheritanceType.JOINED)

  7.组件映射(值对象 和 实体对象)

  @Embeddable

  @Embedded //用于注解组件映射,表示嵌入对象的映射

1 @Embedded
2     public Wife getWife() {
3         return wife;
4     }
5     public void setWife(Wife wife) {
6         this.wife = wife;
7     }

  /*Wife成了Husband的一部分,Wife中的这些字段,也会放到Husband中,Wife在这里只是一个对象,不需要任何注解*/

时间: 2024-11-17 04:39:14

6.关系映射(使用注解的方式表示)的相关文章

Hibernate关系映射(注解)

1.类级别注解 @Entity     映射实体类 @Table    映射数句库表 @Entity(name="tableName") - 必须,注解将一个类声明为一个实体bean. 属性: name - 可选,对应数据库中的一个表.若表名与实体类名相同,则可以省略. @Table(name="",catalog="",schema="")  - 可选,通常和@Entity 配合使用,只能标注在实  体的 class定义处,

《Java从入门到放弃》入门篇:使用注解的方式配置hibernate映射关系

之前我们都是使用配置文件的方式来生成的代码,虽然和JDBC比较简单了很多,但每次都在修改时需要既改实体类又改映射文件.还是有点麻烦. 所以,这一篇,我们来说说使用注解的方式来在接在实体类上配置映射关系. 第一步:新建一个项目,或者把之前项目中的实体类.映射文件,还有hibernate中的mapping标签都删除,然后在DBBrowser中再次生成实体类.如下图: 红框中的选项就表示直接在POJO上以注解的方式加上映射关系.注意括号内的hibernate版本,必须是3.2及以上的才行. 生成后的实

[原创]java WEB学习笔记85:Hibernate学习之路-- -映射 一对一关系 ,基于主键方式实现

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Hibernate学习笔记(四) — session的产生方式 与 一对多关系映射

一.session的创建 Session是由SessionFactory负责创建的,而SessionFactory的实现是线程安全的,多个并发的线程可以同时访问一个SessionFactory并从中获取Session实例,但Session不是线程安全的. 每次openSession,产生的都是一个新的session,相当于创建一个新的连接.但是有很多时候,并不希望这样.比如在淘宝购物,在付账的一瞬间,至少有三件事情发生,转账,仓库数据变化,购物历史记录.而这三件事有必须在同一事务下.自然我们会联

Hibernate之实体关系映射

延迟加载与即时加载 例如Person类和Email类是一对多关系,如果设为即时加载,当加载Person时,会自动加载Email,如果设置为延迟加载,当第一次调用person.getEmails()时才会执行SQL语句加载Email 注解配置时,@OnetToMany(Fetch = FetchType.EAGER)为即时加载,Fetch = FetchType.LAZY为延迟加载 延迟加载和即时加载的策略适用于所有一对多.多对一.多对多等所有的实体关系 一般来说,延迟加载要比即时加载节省资源,但

JPA总结——实体关系映射(一对多@OneToMany)

JPA总结——实体关系映射(一对多@OneToMany) 并注明来源: http://blog.sina.com.cn/s/blog_49fd52cf0100scql.html 一对多模型(单向)说明:一个客户对应多个地址,通过客户可以获得该客户的多个地址的信息.客户和地址是一对多的关系,并且客户与地址是单向关联的关系. 映射策略# 外键关联:两个表的关系定义在一个表中:# 表关联:两个表的关系单独定义一个表中通过一个中间表来关联.映射策略——外键关联 表结构如下: 1 TABLE custom

Hibernate,JPA 对象关系映射之简单映射策略

简单映射 近年来 ORM(Object-Relational Mapping,对象关系映射,即实体对象和数据库表的映射)技术市场热闹非凡,各种各样的持久化框架应运而生,其中影响最大的是 Hibernate 和 Toplink.Sun 公司在充分吸收现有的优秀 ORM 尤其是 Hibernate 框架设计思想的基础上,制定了新的 JPA(Java Persistence API)规范,对现在乱象丛生的持久化市场带来一个标准,大有统一持久化市场的气势.JPA 是通过 JDK5.0 注解或 XML 描

Hibernate(开放源代码的对象关系映射框架)

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久

Hibernate (开放源代码的对象关系映射框架)

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久

SSH-Hibernate(二)—关系映射(上)

关系映射的理解 上篇博客说过ORM是一种持久化的解决方案,它的思想呢就是将关系数据库中的表的记录映射到JAVA对象中.直白的说就是JAVA对象和关系数据库中的记录建立起了固定的对应关系,对象即记录!这样做的带来的最直接的表现就是,开发人员可以以面向对象的思想来操作关系型的数据库. 对象对应的是数据表中的记录,而在关系数据库中记录和记录之间存在着一对一.一对多.多对多等关系.ORM映射也需要保存这些记录之间的关系,它主要通过面向对象中关联关系来实现,继承关系是比较特殊的一种反应记录之间关系的形式.