hibernate几种映射关系的笔记

最近很少写博客,主要是工作的各种变动,也有一个原因是将学习重心从android暂时转移到后台,花了几个月的时间来学习了Spring、SpringMVC、Hibernate。个人觉得其中最难学的应该是hibernate,其中一个大难点就是各种映射关系的处理,这里我自己给自己整理了一下思路,主要是通过《疯狂java ee 企业应用实战》里面的hibernate章节自学整理出来的心得。

我觉得需要学好hibernate的映射关系,必须要有一些非常贴切的例子来说明这个事。但是要举出一个例子来说明整个映射关系,是有点难度。

1.首先介绍最简单的N-1关系,单向N-1关系就好像古代多个老婆伺候一个老公的情况:

假设明妃和德妃同时是雍正的老婆

Wife代码:

public class Wife {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int wife_id;
    private String name;

    @ManyToOne(targetEntity=Husband.class)
    public Husband husband;
    //忽略getter和setter方法
}

Husband代码:

public class Husband {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int husband_id;
    private String name;
    //忽略getter和setter方法
}

test代码:

    public static void main(String[] args){
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();

        Husband yongzheng = new Husband();
        yongzheng.setName("Yongzheng");
        session.persist(yongzheng);

        Wife mingfei = new Wife();
        mingfei.setName("Mingfei");
        mingfei.setHusband(yongzheng);
        Wife defei = new Wife();
        defei.setName("Defei");
        defei.setHusband(yongzheng);

        session.save(mingfei);
        session.save(defei);

        tx.commit();
        session.close();

执行以上代码可以获得以下的对应表:
由于我没有指定@JoinColumn的属性,所以hibernate自动生成了一个husband_husband_id的外键列
N-1关系表

2.然后要说一下相对复杂的1-N关系

  • N-1关系是从老婆的角度来看的,1-N是从老公的角度来看,老公同时拥有多个老婆,老婆的列表需要用Set来表示
  • 1-N的关系涉及到数据库性能的问题,如果用外键列链接的方式来设计的话会涉及到主从表关系的问题,如果你要高清这之间的关系,最好自己百度或者查询相关的书籍
  • 这篇文章的篇幅如果要阐述基于外键1-N关系的性能问题,那就太长了,所以直接用基于连接表的方式来描述

Husband代码

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int husband_id;
    private String name;

    @OneToMany(targetEntity=Wife.class)
    @JoinTable(name="t_husband_wife",
            joinColumns=@JoinColumn(name="husband_id",referencedColumnName="husband_id"),
inverseJoinColumns=@JoinColumn(name="wife_id",referencedColumnName="wife_id",unique=true))
    private Set<Wife> wifes = new HashSet<>();

理论上一个老婆只能伺候一个皇帝吧,所以连接表的wife_id列就加上unique限制,当然电影剧情那些跟太监有关系的在这里就不讨论了

Wife代码

@Entity
@Table(name="t_wife")
public class Wife {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int wife_id;
    private String name;

test代码:

    public static void main(String[] args){
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();

        Wife mingfei = new Wife();
        mingfei.setName("Mingfei");
        session.persist(mingfei);
        Wife defei = new Wife();
        defei.setName("Defei");
        session.persist(defei);

        Husband yongzheng = new Husband();
        yongzheng.setName("Yongzheng");
        yongzheng.getWifes().add(mingfei);
        yongzheng.getWifes().add(defei);
        session.save(yongzheng);

        tx.commit();
        session.close();
    }

执行以上代码之后,数据库:
这里写图片描述

3.双向的1-N和双向N-1其实是同一回事,但是因为性能问题,1端一般都不主动控制关系,需要在ManyToOne里加上mapedBy属性来交出控制权,这里不再一一叙述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值