最近很少写博客,主要是工作的各种变动,也有一个原因是将学习重心从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();
}
执行以上代码之后,数据库: