使用hibernate关联关系是最复杂也最重要的部分,本文对常用的关联关系进行总结,并通过代码验证
一、oneTomany (单向)
Father.java
@Entity
@Table(name = "father")
public class Father {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private Integer id;
@Column(length = 20, nullable = false, name = "NAME")
private String name;
/*
@OneToMany</span>
* @Cascade(value={CascadeType.SAVE_UPDATE})
* 1.创建中间表
* 2.级联保存 删除的时候 仅仅删除father和关联关系 不会删除son
*
*@OneToMany
*@Cascade(value={CascadeType.SAVE_UPDATE,CascadeType.DELETE})
*1.创建中间表
*2.级联保存/删除 删除的时候回删除关联关系和son表数据
*
*@OneToMany
*@Cascade(value={CascadeType.SAVE_UPDATE})
*@JoinColumn(name="f_id")
*1.不创建中间表 ,自动在多方增加字段
*2.删除时关联数据外键置空
*
*
*@OneToMany
*@Cascade(value={CascadeType.SAVE_UPDATE,CascadeType.DELETE})
*@JoinColumn(name="f_id")
*1.不创建中间表 ,自动在多方增加字段
*2.删除时删除关联表数据
*/
private Set<Son> sons = new HashSet<Son>();
……
Son.java
@Entity
@Table(name = "son")
public class Son {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private Integer id;
@Column(length = 20, nullable = false, name = "NAME")
private String name;
//不用设置father
……
二 manytoone (单向)
Son.java
@Entity
@Table(name = "son")
public class Son {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private Integer id;
@Column(length = 20, nullable = false, name = "NAME")
private String name;
/**
* @ManyToOne
* @Cascade(value={CascadeType.SAVE_UPDATE})
* @JoinColumn(name="father_id")
* 1.级联保存
* 2.删除时删除本数据
*
* @ManyToOne
* @Cascade(value={CascadeType.SAVE_UPDATE,CascadeType.DELETE})
* @JoinColumn(name="father_id")
* 1.级联保存
* 2.删除时删除本数据,如果One方没有其他关联也删除,如果有则报错不能删除
*/
private Father father;
……
Father.java
@Entity
@Table(name = "father")
public class Father {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private Integer id;
@Column(length = 20, nullable = false, name = "NAME")
private String name;
//不用设置son
……
三 onetomany(双向)
Father.java
@OneToMany
@Cascade(value={CascadeType.SAVE_UPDATE})
@JoinColumn(name="father_id")
private Set<Son> sons = new HashSet<Son>();
Son.java
@ManyToOne
@Cascade(value={CascadeType.SAVE_UPDATE,CascadeType.DELETE})
@JoinColumn(name="father_id")
private Father father;
双向配置跟单向配置的触发是类似的 上述配置的结果是
1.删除son端 会将father删除 同时将father关联的数据置空(非删除 如果要删除则在one方增加级联删除)
四 manytomany(单向)
@Entity
@Table(name = "teacher")
public class Teacher {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private Integer id;
@Column(length = 20, nullable = false, name = "NAME")
private String name;
/**
* @ManyToMany
@JoinTable(name="stu_tea")
@Cascade(value={CascadeType.SAVE_UPDATE})
1.级联保存
2.删除时,删除teacher和中间表数据
@ManyToMany
@JoinTable(name="stu_tea")
@Cascade(value={CascadeType.SAVE_UPDATE,CascadeType.DELETE})
1.级联保存
2.级联删除
*/
@ManyToMany
@JoinTable(name="stu_tea")
@Cascade(value={CascadeType.SAVE_UPDATE,CascadeType.DELETE})
private Set<Student> teachers=new HashSet<Student>();