关联关系,是使用最多的一种关系,非常重要。在内存中反映为实体关系,映射到 DB
中为主外键关系。实体间的关联,即对外键的维护。关联关系的发生,即对外键数据的改
变。外键:外面的主键,即,使用其它表的主键值作为自已的某字段的取值。
一、基本概念
前4个请查看 Hibernate5讲义
5、关联方向
(1)单向关联
指具有关联关系的实体对象间的加载与访问关系是单向的。即,只有一个实体对象可
以加载和访问对方,但对方是看不到另一方的。
(2)双向关联
指具有关联关系的实体对象间的加载与访问关系是双向的。即,任何一方均可加载和
访问另一方。
6、关联数量
实体对象间的关系,从数量上可以划分为:1:1,1:n,n:1,m:n 。
二、关系映射
demo代码路径:https://github.com/MisterChegy/hibernate
(1)1:n-单向关联
model类 (get,set方法略过)
/**
* 一对多单向关联
*/
@Entity
@Table(name = "minister", catalog = "test")
public class Minister implements java.io.Serializable {
// Fields
private Integer mid;
private String mname;
/**
*一对多单向关联
*/
@Entity
@Table(name = "country", catalog = "test")
public class Country implements java.io.Serializable {
@Id
@Column(name = "cid", unique = true, nullable = false)
private Integer cid;
@Column(name = "cname", length = 45)
private String cname;
//关联属性
@OneToMany(targetEntity = Minister.class, cascade=CascadeType.ALL)
//用来指定与所操作实体或实体集合相关联的数据库表中的列字段
@JoinColumn(name="cid")
private Set<Minister> ministers = new HashSet<Minister>(0);
测试
/*
* 去掉cascade = CascadeType.ALL和mappedBy =
* "country",即取消级联保存和多端维护,然后添加@JoinColumn(name="cid")
* 添加@JoinColumn(name="cid")可以避免生成中间表
*
* 一对多单向关联
*/
@Test
public void test01() {
try {
session.beginTransaction();
model2.Minister minister1 = new model2.Minister(1, "aaa");
Set<model2.Minister> ministers = new HashSet<model2.Minister>();
ministers.add(minister1);
model2.Country country = new model2.Country(1, "USA");
country.setMinisters(ministers);
System.out.println("country = " + country);
session.save(country);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
结果