Hibernate註解的關聯關係映射,分爲2種,即單向關聯映射和雙向關聯映射,它們最大的區別就是在查詢數據時,單向關聯只能通過一邊進行查詢,而雙向關聯兩邊都可以進行查詢。
單向關聯是指只在一方加上註解,
雙向關聯是指雙方都加上註解。這裏主要記錄雙向關聯。
1. 一對一關聯:
如有2張表,公民表Person和身份證表IdCard
一方(IdCard):
@OneToOne(fetch=FetchType.LAZY,//延遲加載
targetEntity=IdCards.class,//目標對象
mappedBy="person",//指定由哪邊維護關係(在這指有Person表維護,‘person’指IdCards標中關聯的Person對象)
cascade=CascadeType.ALL)
另一方(Person):
@OneToOne(fetch=FetchType.LAZY,
targetEntity=Person.class)//維護關係表
@JoinColumn(name="personId",referencedColumnName="personId",unique=true)
具體如下:
@Entity
@Table(name = "tb_person")
public class Person implements Serializable {
private static final long serialVersionUID = 576770011136181361L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long personId;
@OneToOne(fetch=FetchType.LAZY,targetEntity=IdCards.class,mappedBy="person",cascade=CascadeType.ALL)
private IdCard idcard;
@Entity
@Table(name = "tb_idcard")
public class Idcard implements Serializable {
private static final long serialVersionUID = 576770011136181369L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long idcardId;
@OneToOne(fetch=FetchType.LAZY,
targetEntity=Person.class)
@JoinColumn(name="personId",referencedColumnName="personId",unique=true)
private Person person;
2. 一對多關係:
一方:
@OneToMany(fetch=FetchType.LAZY,
targetEntity=User.class,
cascade=CascadeType.ALL,
orphanRemoval=true,//孤兒刪除
mappedBy="department")
cascade=CascadeType.ALL,,即交由多的一方控制;
多方:@ManyToOne(fetch = FetchType.LAZY,targetEntity = Department.class)@JoinColumn(name = "departmentId",referencedColumnName="departmentId")
如:一個用戶只能屬於一個部門,一個部門裏可以有很多用戶,其註解如下,
部門實體類:
@Entity
@Table(name = "tb_department")
public class Department implements Serializable {
private static final long serialVersionUID = -3489189232910430049L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long departmentId;
private String name;
private String description;
@OneToMany(fetch=FetchType.LAZY,targetEntity=User.class,cascade=CascadeType.ALL,orphanRemoval=true,mappedBy="department")
private Set<User> users;
........
}
用戶實體類:
@Entity
@Table(name="tb_user")
public class User implements Serializable {
private static final long serialVersionUID = 576770011136181361L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long userId;
@ManyToOne(fetch = FetchType.LAZY,targetEntity = Department.class)
@JoinColumn(name = "departmentId",referencedColumnName="departmentId")
private Department department;
private String loginName;
........
........
}2. 多對多關係:
多方:
@ManyToMany(fetch=FetchType.LAZY,targetEntity=Role.class)@JoinTable(name = "tb_user_role", joinColumns = @JoinColumn(name = "userId",referencedColumnName="userId") , inverseJoinColumns = @JoinColumn(name = "roleId",referencedColumnName="roleId"))
其中“tb_user_role”是兩者的關係表,由兩者的主鍵ID組成。通過@JoinColumn(name = "userId")指定在關係表中的字段名。
另一個多方:
@ManyToMany(fetch = FetchType.LAZY, targetEntity = User.class, cascade = CascadeType.ALL, mappedBy = "roles")
joinColumns :指主表,inverseJoinColumns :指匹配表
即user-->role,則user是主表,role是匹配表
如:一個用戶可以有多個角色,一個角色可以適用於多個用戶。
用戶實體類:
@Entity
@Table(name="tb_user")
public class User implements Serializable {
private static final long serialVersionUID = 576770011136181361L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long userId;
private String loginName;
private String name;
private String gender;
private String phone;
private String email;
private String description;
@ManyToMany(fetch=FetchType.LAZY,targetEntity=Role.class)
@JoinTable(name = "tb_user_role", joinColumns = @JoinColumn(name = "userId",referencedColumnName="userId") ,
inverseJoinColumns = @JoinColumn(name = "roleId",referencedColumnName="roleId"))
private Set<Role> roles = new HashSet<Role>();
.....
}
角色實體類:
@Entity
@Table(name = "tb_role")
public class Role implements Serializable {
private static final long serialVersionUID = -7625883839295666830L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long roleId;
private String name;
private String description;
@ManyToMany(fetch = FetchType.LAZY, targetEntity = User.class, cascade = CascadeType.ALL, mappedBy = "roles")
private Set<User> users = new HashSet<User>();
.....
.....
}
2. 自連接關係:
自連接一方:
@ManyToOne(fetch = FetchType.LAZY, targetEntity = Department.class)
@JoinColumn(name = "parentId",referencedColumnName="departmentId")
自連接多方:
@OneToMany(fetch=FetchType.LAZY,targetEntity=Department.class,cascade=CascadeType.ALL,orphanRemoval=true,mappedBy="parent")
@OrderBy("departmentId ASC")
因爲是自連接,在一個表裏操作,表中要增加一個父類id,用戶建立連接。
如:部門管理,一個部門可以有很多個下級部門,但是一個上級部門只能有一個上級部門,這時需要建立自連接。
部門實體類::
@Entity
@Table(name = "tb_department")
public class Department implements Serializable {
private static final long serialVersionUID = -3489189232910430049L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long departmentId;
private String name;
private String description;
@ManyToOne(fetch = FetchType.LAZY, targetEntity = Department.class)
@JoinColumn(name = "parentId",referencedColumnName="departmentId")
private Department parent;
@OneToMany(fetch=FetchType.LAZY,targetEntity=Department.class,cascade=CascadeType.ALL,orphanRemoval=true,mappedBy="parent")
@OrderBy("departmentId ASC")
private Set<Department> children = new HashSet<Department>();
....
.....
}