什么是级联?
简单的说,没有配置级联的时候,删除分类,其对应的产品不会被删除。
但是如果配置了恰当的级联,那么删除分类的时候,其对应的产品都会被删除掉。
/**
* (Optional) The operations that must be cascaded to
* the target of the association.
*
* <p> By default no operations are cascaded.
*/
CascadeType[] cascade() default {};
谷歌翻译对注释的翻译:必须级联到关联目标的操作。默认情况下没有级联操作。
这里解释一下,级联的意思是:
-
本实体做了什么事,也要拉上 另一个关联的实体,导致另一个实体跟着做事情。就是说我删除了,你也得删除!
-
关联目标,指的是 关联的那个实体。
注:级联通常用在one-many和many-to-many上,几乎不用在many-one上。
在有中间关系表的情况下,比如 user/role/user_role 这三张表,只对应User/Role两个实体对象就够了!中间表是由User对象或者Role对象维护的,不用另外新建user_role的实体!
user表 —— id name
role表 —— id name
user_role表 —— user_id role_id
@Entity
@Table(name = "user")
public class User
{
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "user_role", joinColumns = {@JoinColumn(name= "user_id")}, inverseJoinColumns = {@JoinColumn(name = "role_id")})
private Set<Role> roles;
}
@Entity
@Table(name = "role")
public class Role
{
@ManyToMany(fetch= FetchType.LAZY)
@JoinTable(name = "user_role", joinColumns = {@JoinColumn(name= "role_id")}, inverseJoinColumns = {@JoinColumn(name = "user_id")})
private Set<User> users;
}
CascadeType枚举源码:
/**
* Defines the set of cascadable operations that are propagated
* to the associated entity.
* The value <code>cascade=ALL</code> is equivalent to
* <code>cascade={PERSIST, MERGE, REMOVE, REFRESH, DETACH}</code>.
*
* @since Java Persistence 1.0
*/
public enum CascadeType {
/** Cascade all operations 级联所有操作 */
ALL,
/** Cascade persist operation 级联新增 */
PERSIST,
/** Cascade merge operation 级联更新或者新增 */
MERGE,
/** Cascade remove operation 级联删除 */
REMOVE,
/** Cascade refresh operation 级联刷新 */
REFRESH,
/**
* Cascade detach operation
* 级联分离
* @since Java Persistence 2.0
*
*/
DETACH
}
参考来源于: