Hibernate的关联映射——单向1-N关联

  单向1-N关联的持久化类里需要使用集合属性。因为1的一端需要访问N的一端,而N的一端将以集合(Set)形式表现。从这个意义上来看,1-N(实际上还包括N-N)和集合属性非常相似,只是此时集合里的元素是关联实体。

  对于单向的1-N关联关系,只需要在1的一端增加Set类型的成员变量,该成员变量记录当前实体所有的关联实体,当然还要为这个Set类型的属性增加setter和getter方法。

  为了映射1-N关联,需要使用@OneToMany注解。

1.无连接表的单向1-N关联

  需要在N的一端添加外键列来维护关联关系,但由于程序此时只让1一端控制关联关系,因此直接在1的一端使用@JoinColumn修饰Set集合属性、映射外键列即可。

  下面的Person实体可以关联多个Address实体。

 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.OneToMany;
 import javax.persistence.Table;

 import org.hibernate.annotations.Cascade;
 import org.hibernate.annotations.CascadeType;

 /**
  *    一个Person实例可以关联多个Address实例
  */
 @Entity
 @Table(name="person")
 public class Person {
     @Id    @Column(name="p_id")
     @GeneratedValue(strategy=GenerationType.IDENTITY)
     private Integer id;
     @Column(name="p_name")
     private String name;
     @Column(name="p_age")
     private Integer age;
     //定义该Person实例所有关联的Address实体
     @OneToMany(targetEntity=Address.class)
     //映射外键列,此处映射的外键列将会添加到关联实体对应的数据表中,
    //注意并不是添加到当前的实体对应的数据表中,而是关联实体对应的数据表中 @JoinColumn(name="p_id",referencedColumnName="p_id") @Cascade(CascadeType.ALL) private Set<Address> addresses = new HashSet<>(); public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Set<Address> getAddresses() { return addresses; } public void setAddresses(Set<Address> addresses) { this.addresses = addresses; } }

  Address则不需要维护与Person类的关系,所以比较简单。

 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.Table;

 @Entity
 @Table(name="address_inf")
 public class Address {
     @Id    @Column(name="address_id")
     @GeneratedValue(strategy=GenerationType.IDENTITY)
     private Integer id;
     @Column(name="address_name")
     private String name;
     public Address(){

     }
     public Address(String name){
         this.name = name;
     }
     public Integer getId() {
         return id;
     }
     public void setId(Integer id) {
         this.id = id;
     }
     public String getName() {
         return name;
     }
     public void setName(String name) {
         this.name = name;
     }
 }

  测试效果。

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.mytest.test1.HibernateUtil;

public class Test {
    public static void main(String[] args) {
        Session session = HibernateUtil.currentSession();
        Transaction tx = session.beginTransaction();
        //创建一个Person对象
        Person person = new Person();
        //创建一个顺泰的Address对象
        Address addressA = new Address("A");
        //为Person对象设置值
        person.setName("liujiang");
        person.setAge(24);
        //设置Person和Address之间的关联
        person.getAddresses().add(addressA);
        //持久化person对象
        session.save(person);
        //创建一个瞬态的Address对象
        Address addressB = new Address("B");
        //持久化addressB
        session.persist(addressB);
        //修改持久化状态的person对象
        person.getAddresses().add(addressB);
        tx.commit();
        HibernateUtil.currentSession();
    }
}

2.有连接表的单向1-N关联

  对于有连接表的单向1-N关联,同样需要使用过@OneToMany修饰代表关联实体的集合属性。除此之外,程序还应该用@JoinTable显式指定连接表。

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name="person2")
public class Person2 {
    @Id    @Column(name="p_id")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;
    @Column(name="p_name")
    private String name;
    @Column(name="p_age")
    private Integer age;
    //定义该Person实体所有关联的Address实体
    @OneToMany(targetEntity=Address.class)
    //映射连接表为person_address
    @JoinTable(
            name="person_address",
            //定义连接表中名为“p_id”的外键列,该外键列参照当前实体对应表的主键列
            joinColumns=@JoinColumn(
                    name="p_id",
                    referencedColumnName="p_id"
                    ),
            //定义连接表中名为address_id的外键列
            //该外键列参照当前实体关联的实体对应表的主键列
            inverseJoinColumns=@JoinColumn(
                    name="address_id",
                    referencedColumnName="p_id",
            unique=true
) ) public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }

Hibernate的关联映射——单向1-N关联的更多相关文章

  1. Hibernate的关联映射——单向1-1关联

    Hibernate的关联映射--单向1-1关联 对于单向的1-1关联关系,需要在持久化类里增加代表关联实体的成员变量,并为该成员变量添加setter方法和getter方法.从持久化类的代码上看,单向1 ...

  2. Hibernate的关联映射——单向N-1关联

    Hibernate的关联映射--单向N-1关联 N-1是非常常见的关联关系,最常见的父子关系也是N-1关联,单向的N-1关联只需从N的一端可以访问1的一端. 为了让两个持久化类能够支持这种关联映射,程 ...

  3. hibernate之关于一对一单向,双向关联映射

    [hibernate]之关于一对一单向,双向关联映射 首先我们来看,Hibernate官方对于一对一单向关联的解释: 基于外键关联的单向一对一关联和单向多对一关联差点儿是一样的. 唯一的不同就是单向一 ...

  4. 016 多对多关联映射 单向(many-to-many)

    一般的设计中,多对多关联映射,需要一个中间表 Hibernate会自动生成中间表 Hibernate使用many-to-many标签来表示多对多的关联 多对多的关联映射,在实体类中,跟一对多一样,也是 ...

  5. (转)MyBatis框架的学习(五)——一对一关联映射和一对多关联映射

    http://blog.csdn.net/yerenyuan_pku/article/details/71894172 在实际开发中我们不可能只是对单表进行操作,必然要操作多表,本文就来讲解多表操作中 ...

  6. 【Hibernate框架】关联映射(多对多关联映射)

    按着我们的总结行进计划,接下来,就是有关于多对多映射的总结了. 我们来举个例子啊,很长时间以来,房价暴涨不落,但是还有很多人拥有很多套房产,假如说,一个富豪拥有九套房产,家里人么准去住哪一套,我们就以 ...

  7. 014 一对多关联映射 单向(one-to-many)

    在对象模型中,一对多的关联关系,使用集合来表示. 实例场景:班级对学生:Classes(班级)和Student(学生)之间是一对多的关系. 多对一.一对多的区别: 多对一关联映射:在多的端加入一个外键 ...

  8. Hibernate框架关系映射一对多双向关联

    直入主题,首先大配置常规配置, 这里住要说关联关系,大配置不多少,而且jar包默认添加好,笔者用的是idea2016. 然后我们知道关联关系主要是在小配置添加节点来配置属性.个人认为关联映射,就是对应 ...

  9. 论坛:一对一关联映射/单向关联/两个类间,可以有两个(多个)关联关系/content为大文本类型/

    >>单向:只写一端的映射属性,另一端不写(有一端用不着);双向:两端都写映射属性 >>一对一关联有两类:一类基于主键的(一般不使用),一类基于外键的(重点学习): 外键:是一个 ...

随机推荐

  1. SVN 的安装与配置

    1.下载subclipse1.6的site包 2.把这个site-1.6.2解压开,将其内部的文件,全部放到 C:\Program Files\MyEclipse\MyEclipse 9\dropin ...

  2. BizTalk动手实验(十一)自定义开发管道组件

    1 课程简介 通过本课程熟悉自定义开始管道组件的流程.各组件接口的功能作用以及自定义管道. 本场景为开发一个消息ZIP压缩的发送管道组件. 2 准备工作 1. 熟悉管道组件各阶段组成 2. 下载Ion ...

  3. php课程---数组

    数组:    一:定义 1.赋值定义    $arr[0] = 5;    $arr[1] = "aa";        print_r ($arr); 2.定义索引数组    $ ...

  4. IOS第16天(4,Quartz2D柱状图)

    *** #import "HMBarView.h" #import "UIColor+Random.h" @implementation HMBarView - ...

  5. 基于php5.6 php.ini详解

    PHP中auto_prepend_file与auto_append_file的用法 第一种方法:在所有页面的顶部与底部都加入require语句.例如:?123require('header.php') ...

  6. iOS开发UI篇—Quartz2D使用(绘制基本图形)

    iOS开发UI篇—Quartz2D使用(绘制基本图形) 一.简单说明 图形上下文(Graphics Context):是一个CGContextRef类型的数据 图形上下文的作用:保存绘图信息.绘图状态 ...

  7. Eclemma各种安装方式以及安装失败解决

    在线安装方法一: 在eclipse的菜单栏点击 Help -> Install New Software -> add Name:eclemma (名称可以随便填) Location:ht ...

  8. KVC浅析和实例

    KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲解. Key-Value Coding (KVC) KVC,即是指 NSKeyValueCoding,一 ...

  9. Oracle中用户的基本操作

    创建用户 1.首先登陆到系统用户sys(sys用户具有创建用户的权限). 2.然后在代码编辑框写入创建用户的代码. 语法:CREATE USER user_name IDENTIFIED BY pas ...

  10. 20151208_使用windows2012配置weblogic节点管理器

    经过实践,weblogic节点管理器的作用主要有两点: 1.可通过weblogic控制台远程控制被管server启停. 2.可以自动重启被管server的进程,并且对spring框架提供比直接启动更快 ...