CascadeType.REMOVE 級聯刪除操作,刪除當前實體時,與它有映射關系的實體也會跟着被刪除。
CascadeType.MERGE 級聯更新(合並)操作,當Student中的數據改變,會相應地更新Course中的數據。
CascadeType.DETACH 級聯脫管/游離操作,如果你要刪除一個實體,但是它有外鍵無法刪除,你就需要這個級聯權限了。它會撤銷所有相關的外鍵關聯。
CascadeType.REFRESH 級聯刷新操作,假設場景 有一個訂單,訂單里面關聯了許多商品,這個訂單可以被很多人操作,那么這個時候A對此訂單和關聯的商品進行了修改,與此同時,B也進行了相同的操作,但是B先一步比A保存了數據,那么當A保存數據的時候,就需要先刷新訂單信息及關聯的商品信息后,再將訂單及商品保存。
CascadeType.ALL 擁有以上所有級聯操作權限。
一(被擁有方)mappedBy,mappedBy = "‘多’的實體類的屬性字段",mappedBy 為被擁有方
多(擁有方) @JoinColumn
-----------------------------------------------------------------------
一對一
people 用戶表(id,name,sex,birthday,address_id)
address 地址表(id,phone,zipcode,addr)
people 表
@Entity
public class People {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;//id
@Column(name = "name", nullable = true, length = 20)
private String name;//姓名
@Column(name = "sex", nullable = true, length = 1)
private String sex;//性別
@Column(name = "birthday", nullable = true)
private Timestamp birthday;//出生日期
@OneToOne(cascade=CascadeType.ALL)
//People是關系的維護端,當刪除 people,會級聯刪除 address
@JoinColumn(name = "address_id", referencedColumnName = "id")
//name:關聯id,referencedColumnName:地址表id
private Address address;//地址
}
關聯的實體的主鍵一般是用來做外鍵的。但如果此時不想主鍵作為外鍵,則需要設置referencedColumnName屬性。
當然這里關聯實體(Address)的主鍵 id 是用來做主鍵,所以這里第23行的 referencedColumnName = "id" 實際可以省略。
address 表
@Entity
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;//id
@Column(name = "phone", nullable = true, length = 11)
private String phone;//手機
@Column(name = "zipcode", nullable = true, length = 6)
private String zipcode;//郵政編碼
@Column(name = "addr", nullable = true, length = 100)
private String addr;//地址
//如果不需要根據Address級聯查詢People,可以注釋掉,mappedBy = "People實體類中address屬性"
// @OneToOne(mappedBy = "address", cascade = {CascadeType.MERGE, CascadeType.REFRESH}, optional = false)
// private People people;
}
-----------------------------------------------------------------------
一對多
author 作者表(id,name)
article 文章表(id,title,conten,author_id)
author 表
@Entity
public class Author {
@Id // 主鍵
@GeneratedValue(strategy = GenerationType.IDENTITY) // 自增長策略
private Long id; //id
@NotEmpty(message = "姓名不能為空")
@Size(min=2, max=20)
@Column(nullable = false, length = 20)
private String name;//姓名
//mappedBy = "Article實體類中author屬性"
@OneToMany(mappedBy = "author",cascade=CascadeType.ALL,fetch=FetchType.LAZY)
//級聯保存、更新、刪除、刷新;延遲加載。當刪除用戶,會級聯刪除該用戶的所有文章
//擁有mappedBy注解的實體類為關系被維護端
private List<Article> articleList;//文章列表
}
article 表
@Entity
public class Article {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // 自增長策略
@Column(name = "id", nullable = false)
private Long id;
@NotEmpty(message = "標題不能為空")
@Size(min = 2, max = 50)
@Column(nullable = false, length = 50) // 映射為字段,值不能為空
private String title;
@Lob // 大對象,映射 MySQL 的 Long Text 類型
@Basic(fetch = FetchType.LAZY) // 懶加載
@NotEmpty(message = "內容不能為空")
@Size(min = 2)
@Column(nullable = false) // 映射為字段,值不能為空
private String content;//文章全文內容
//可選屬性optional=false,表示author不能為空。刪除文章,不影響用戶
@ManyToOne(cascade={CascadeType.MERGE,CascadeType.REFRESH},optional=false)
//author_id關聯author的id字段
@JoinColumn(name = "author_id", referencedColumnName = "id")
private Author author;//所屬作者
}
-----------------------------------------------------------------------
多對多(可以隨意指定一方為關系維護端 @JoinColumn)
user 用戶表(id,username,password)
user_authority 中間表(user_id,authority_id)
authority 權限表(id,authname)
User.java
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotEmpty(message = "賬號不能為空")
@Size(min=3, max=20)
@Column(nullable = false, length = 20, unique = true)
private String username; // 用戶賬號,用戶登錄時的唯一標識
@NotEmpty(message = "密碼不能為空")
@Size(max=100)
@Column(length = 100)
private String password; // 登錄時密碼
@ManyToMany
@JoinTable(name = "user_authority",joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "authority_id"))
//關系維護端,負責多對多關系的綁定和解除,即實現User.setAuthorityList(authority)
// @JoinTable name:關聯表的名字,joinColumns:關聯User表的id,inverseJoinColumns:關聯Authority表的id
private List<Authority> authorityList;
}
Authority.java
@Entity
public class Authority {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(nullable = false)
private String authname; //權限名
//mappedBy = "User實體類中authorityList屬性"
@ManyToMany(mappedBy = "authorityList")
private List<User> userList;
}
-------------------------------------------------------------------------------------