我通常使用CascadeType.ALL
来注释我的one-to-many
,many-to-many
和many-to-one
关系,因为它们为我提供了所有我需要的功能。但我感觉这可能会在将来给我带来一些问题。使用CascadeType.ALL
是否可以?我应该注意什么,为什么不应该使用它?
我通常使用CascadeType.ALL
来注释我的one-to-many
,many-to-many
和many-to-one
关系,因为它们为我提供了所有我需要的功能。但我感觉这可能会在将来给我带来一些问题。使用CascadeType.ALL
是否可以?我应该注意什么,为什么不应该使用它?
级联操作是指涉及一个对象的持续性动作通过关联操作影响其他对象。
级联操作可以应用于多种Hibernate操作,通常是传递性的。定义关联属性的注释中的"cascade=CascadeType..."属性说明了该关联所要级联的操作。
Cascade = "all"表示应用所有主要的级联类型。
从Hibernate 5.3开始,这些类型包括:
(其中一些级联类型名称已经过时或被弃用。)
还有三个复合类型:
@Cascade
注解。你确定当我在 JPA 注解中使用 cascade 时,它会应用所有 Hibernate 的级联类型吗? - user12099587CascadeType.ALL
,何时应该使用?
CascadeType.ALL
是所有操作(PERSIST,MERGE,REMOVE,REFRESH,DETACH
),它们会传播到关联实体以及持久化上下文中的相关实体。
所以,这个问题非常普遍,如果您知道这些定义,就可以确定是否有必要使用CascadeType.ALL
。
文档:
EntityManager
具有用于持久化新实体、删除(remove
)现有实体、从数据存储区刷新实体状态以及将脱离的实体状态合并回持久性上下文的API。
当EntityManager
执行上述操作时,您可以指示它自动级联操作到具有元数据注释的级联属性中保存的实体。此过程是递归的。级联属性接受一组CascadeType枚举值。
CascadeType.PERSIST: 持久化实体时,也持久化保存在此字段中的实体。我们建议自由使用此级联规则,因为如果EntityManager在flush期间发现引用新实体的字段,并且该字段不使用CascadeType.PERSIST,则会出现错误。
CascadeType.MERGE: 合并实体状态时,也合并保存在此字段中的实体。
CascadeType.REMOVE: 删除实体时,也删除保存在此字段中的实体。
CascadeType.REFRESH: 刷新实体时,也刷新保存在此字段中的实体。
CascadeType.DETACH: 分离实体时,也分离保存在此字段中的实体。
REFERENCES:
EmployeeEntity.java
@Entity
@Table(name = "Employee")
public class EmployeeEntity implements Serializable
{
private static final long serialVersionUID = -1798070786993154676L;
@Id
@Column(name = "ID", unique = true, nullable = false)
private Integer employeeId;
@Column(name = "FIRST_NAME", unique = false, nullable = false, length = 100)
private String firstName;
@Column(name = "LAST_NAME", unique = false, nullable = false, length = 100)
private String lastName;
@OneToMany(cascade=CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name="EMPLOYEE_ID")
private Set<AccountEntity> accounts;
//Getters and Setters Ommited
}
AccountEntity.java
@Entity
@Table(name = "Account")
public class AccountEntity implements Serializable
{
private static final long serialVersionUID = 1L;
@Id
@Column(name = "ID", unique = true, nullable = false)
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Integer accountId;
@Column(name = "ACC_NO", unique = false, nullable = false, length = 100)
private String accountNumber;
@OneToOne (mappedBy="accounts", fetch = FetchType.LAZY)
private EmployeeEntity employee;
}
@OneToMany(cascade=CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinColumn(name="EMPLOYEE_ID")
private Set<AccountEntity> accounts;
JPA中没有默认的级联类型。默认情况下,不会级联任何操作。