我正在使用JPA 2。
我想了解以下内容。
什么是限制插入,更新或删除的最佳方法 父表中不存在父键。
我有以下实体方案
@Entity
public class Employee {
@OneToMany(mappedBy = "requester")
private Set<Project> requestedProjects;
@OneToMany(mappedBy = "approver")
private Set<Project> approvedProjects;
}
@Entity
public class Project
@ManyToOne
@JoinColumn(name = "EMPLOYEE_NUMBER", referencedColumnName = "EMPLOYEE_NUMBER")
private Employee requester;
@ManyToOne
@JoinColumn(name = "APPROVER", referencedColumnName = "EMPLOYEE_NUMBER")
private Employee approver;
}
我对此问题的有限理解是,如果父键不存在,cascade=cascadeType.ALL
的使用会插入和删除。
MERGE
,PERSIST
和ALL
之间有什么区别?
fetch = FetchType
任何帮助都非常值得赞赏
答案 0 :(得分:2)
这些是单独的问题。 1)级联设置按照名称建议执行:当您调用entityManager persist,merge或remove时,它会对传入的实体执行操作。然后,此调用将根据映射设置级联到引用的实体,就像您明确调用该方法一样在被引用的实体上。所以Project-&gt; requester,如果你在Project上调用persist,如果级联持久或者指定了所有类型,它将在项目和请求者员工上调用persist。因此,如果员工存在但是已分离,则会立即或在刷新/提交时导致异常,具体取决于您的提供者,就像您直接调用em.persist(employee)一样。按照JPA规范概述的自身限制和行为,合并和删除操作方式相同。
CascadeType.All只是列出所有级联类型的便捷方式:REMOVE,PERSIST和MERGE,无需输入。
您应该在它们有意义时使用它们,而不仅仅将每个关系标记为CascadeType.ALL。有很多教程可以提供帮助
2)获取类型确定何时进行提取。通常建议使用Lazy,这就是JPA规范中集合映射的默认设置,因为不必要地引入对象会浪费资源。但这一切都取决于您的应用程序的使用模式,以及您如何优化您的提供程序,数据库和映射。使用默认值,读取项目不会导致所有引用的Employees被读入,直到触发集合。但是,在Employee中读取将导致其项目从数据库中读取。应该注意的是,通过读入单个实体实例,您不会错误地读取整个数据库 - 如果您有急切的集合映射,这是很常见的。