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

  对于1-N的关联,Hibernate推荐使用双向关联,而且不要让1的一端控制关联关系,而是用N的一端控制关联关系。双线的1-N关联和N-1关联是两种相同的情形,两端都需要增加对关联属性的访问,N的一端增加引用到关联实体的属性,1的一端增加集合属性,集合的元素为关联实体。

  Hibernate对双向的1-N关联同样提供了有连接表和无连接表的两种关联映射策略。

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

  无连接表的双向1-N关联,N的一端需要增加@ManyToOne注解来修饰代表关联实体的属性,而1的一端则需要使用@OneToMany注解来修饰代表关联实体的属性。

  底层数据库为了记录这种1-N关联关系,只需要在N的一端的数据表里添加一个外键列即可,因此应该在使用@ManyToOne注解的同时,使用@JoinColumn来映射外键列。

  对于双向的1-N关联映射,通常不应该允许1的一端控制关联关系,而应该由N的一端控制关联关系,因此应该在使用@OneToMany时指定mappedBy属性——一旦为@OneToMany、@ManyToMany指定了该属性,则表明当前实体不能控制关联关系。当@OneToMany、@ManyToMany、@OneToOne所在的当前实体放弃控制关联关系之后,Hibernate就不会允许使用@JoinColumn或@JoinTable修饰代表关联实体的属性了。

(1)双向1-N中1的一端的代码示例

import java.util.HashSet;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name="person_info")
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;
    @OneToMany(targetEntity=Address.class,mappedBy="person")
    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;
    }
}

(2)双向1-N中N的一端的代码示例

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.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name="address_info")
public class Address {
    @Id    @Column(name="address_id")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;
    @Column(name="address_name")
    private String name;
    @ManyToOne(targetEntity=Person.class)
    @JoinColumn(
            name="p_id",
            referencedColumnName="p_id",
            nullable=false
            )
    private Person person;
    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 Person getPerson() {
        return person;
    }
    public void setPerson(Person person) {
        this.person = person;
    }
}

(3)测试例子

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 p = new Person();
        //设置Person的属性
        p.setName("liujiang");
        p.setAge(24);
        //持久化Person对象——插入主表记录
        session.save(p);
        //创建一个瞬态的Address对象
        Address a1 = new Address("A");
        //设置Person和Address之间的关联关系
        a1.setPerson(p);
        //持久化Address对象——插入从表记录
        session.persist(a1);
        //再创建一个瞬态的Address对象
        Address a2 = new Address("B");
        //设置Person和Address之间的关联关系
        a2.setPerson(p);
        //持久化Address对象——插入从表记录
        session.persist(a2);
        tx.commit();
        HibernateUtil.closeSession();
    }
}

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

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

  1. 017 多对多关联映射 双向(many-to-many)

    多对多关联映射 双向 两方都持有对象引用,修改对象模型,但数据的存储没有变化. 再修改映射文件: public class Role { private int id; private String ...

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

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

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

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

  4. (Hibernate进阶)Hibernate映射——一对一双向关联映射(六)

    上一篇博客我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息.如图所示: 关键原因在于对象模型具有方向性: 单向: ...

  5. Hibernate一对一双向关联映射

    关键原因在于对象模型具有方向性: 单向:一端只能加载另一端,不能反过来. 双向:两端都可以加载另一端. 问题来了:如何我们想从身份证端(IdCard)加载人(Person),怎么办呢? 下面我们开始介 ...

  6. Hibernate从入门到精通(六)一对一双向关联映射

    在上次的博文Hibernate从入门到精通(五)一对一单向关联映射中我们讲解了一下一对一单向关联映射,这次我们继续讲解一下与之对应的一对一双向关联映射. 一对一双向关联 与一对一单向关联映射所不同的的 ...

  7. Hibernate(六)一对一双向关联映射

    在上次的博文Hibernate从入门到精通(五)一对一单向关联映射中我们讲解了一下一对一单向关联映射, 这次我们继续讲解一下与之对应的一对一双向关联映射. 一对一双向关联 与一对一单向关联映 射所不同 ...

  8. Hibernate一对多单向关联和双向关联映射方法及其优缺点 (待续)

    一对多关联映射和多对一关联映射实现的基本原理都是一样的,既是在多的一端加入一个外键指向一的一端外键,而主要的区别就是维护端不同.它们的区别在于维护的关系不同: 一对多关联映射是指在加载一的一端数据的同 ...

  9. 【SSH进阶之路】Hibernate映射——一对一双向关联映射(六)

    上篇博文[SSH进阶之路]Hibernate映射--一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指仅仅能从人(Person)这端载入身份证端(IdCard),可是反过来.不能从身份 ...

随机推荐

  1. thinkphp自定义权限管理之名称判断

    权限管理,就是给不同的用户分配不同的权限.当用户登录或者操作时候进行判断,来阻止用户进行权限以外的操作.本次讲的是当用户登录一刻,只显示权限开启的内容. 一.建立数据库. 1.权限表funcla.来存 ...

  2. IOS第18天(2,CALayer自定义图层)

    - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...

  3. Excel 中 Index 和 Match 方法的使用

    MATCH函数(返回指定内容所在的位置) MATCH(lookup-value,lookup-array,match-type) lookup-value:表示要在区域或数组中查找的值,可以是直接输入 ...

  4. soap request by afnetworking2.X/3.X

    for 2.X 参考 http://jiapumin.iteye.com/blog/2109378 AFHTTPRequestOperationManager *manager = [AFHTTPRe ...

  5. Centos 6.5升级到Git2.1.2

    安装需求 # yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel# yum install gcc pe ...

  6. Redis主从在线互相切换

    由于某些原因,我们可能需要将redis master更换机器,我们可以停机进行更换,但是那样可能影响到用户体验.本文简要操作进行不停机迁移. 系统环境 CentOS 6.3 x64redis-serv ...

  7. <构建之法> 第四章 结对 读后感

    粗读 第四章主要讲的是关于结对合作的事项.大多数的软件开发都是团体性的,而合作的最小单位也就是两个人,这也是软件开发中的最佳实践.而结对中,我们能够更好的编写我们的代码,能够少一些担心,对自己的代码也 ...

  8. 关于js SDK的程序,java SDK的程序

    一:JS SDK 1.修改配置workspace 2.导入 3.Demo.html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Trans ...

  9. [PCL]FPFH描述子

    fpfh_est.setSearchSurface(data); 如果没有设置SearchSurface,使用input数据集作为查找的表面 // If no search surface has b ...

  10. JS错误捕获

    try/catch/finally错误捕获 try { //一旦try中出现错误,直接跳到执行catch的内容,执行完catch的内容,代码继续执行 throw new Error('错误'); // ...