hibernate几种映射关系的笔记

    xiaoxiao2022-06-30  52

    最近很少写博客,主要是工作的各种变动,也有一个原因是将学习重心从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的外键列

    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属性来交出控制权,这里不再一一叙述

    转载请注明原文地址: https://ju.6miu.com/read-1125596.html

    最新回复(0)