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. Struts 2.x No result defined for action 异常

      这是我跑struts2的第一个例子,跑的也够郁闷的,这个问题烦了我几个钟... 2011-5-10 10:10:17 com.opensymphony.xwork2.util.logging.co ...

  2. IOS第十天(1:QQ好友列表 ,自定义的headview,代理 ,通知 ,black的使用)

    *****HMViewController.m #import "HMViewController.h" #import "HMFriendsGroupModel.h&q ...

  3. DOM概述

    <!-- DOM:Document Object Model 文档对象模型 用来将标记型文档封装成对象,并将标记型文档中的所有内容(标签,文本,属性等)都封装成对象 封装成对象的目的是为了更为方 ...

  4. ionic 运用pouchdb/sqlite 数据库做本地存储

    配置数据库环境需要3步: 1.安装slqite插件 在ionic 工程目录对应终端执行一下命令: npm install cordova-plugin-sqlite 2.安装pouchdb 在ioni ...

  5. URAL 2080 莫队

    题意 有m种卡 给出卡的使用序列 要求每次从卡堆的顶部抽一张出来 刚好符合序列 输出初始 卡堆的排序 再输出每次抽出卡用后 卡插回卡堆的时候 这张卡上面有几张卡 初始排序很容易就可以搞出来 但是需要注 ...

  6. Unable to establish connection to tokens

    安装openstack后遇到的第一个问题. 执行命令nova list得到如下结果: [root@localhost ~(keystone_admin)]# nova list No handlers ...

  7. IIS应用程序池最大进程数设置

    1.当工作进程数>1时,如果有多个连接请求就会启动多个工作进程实例来处理,所启动的最多工作进程数就是你设置的最大进程数,后续更多的连接请求会循环的发送至不同的工作进程来处理.每个工作进程都能承担 ...

  8. 【C51】UART串口通信

    我们常需要单片机和其他模块进行通信,数据传输,常用的方式就是串口通信技术. 常用来 单片机<-->电脑,  单片机<-->单片机之间通信. 串行通信 versus 并行通信 并 ...

  9. 关于ios8模拟器不能输入中文问题以及软键盘不弹出问题

    在Xcode菜单栏中   Product->scheme->Edit Scheme->Options->Application Region改为中国,就可以输入中文了, 如果软 ...

  10. 盒模型--padding

    突然增加padding会使盒子变大,所以要按实际情况做调整. 没有写padding的时候: <style>div{ background:gray;}</style></ ...