cascade = cascadeType和fetch = FetchType的用法

时间:2013-07-23 11:43:24

标签: hibernate jpa jpa-2.0

我正在使用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的使用会插入和删除。

MERGEPERSISTALL之间有什么区别?

  • 此外,建议使用fetch = FetchType

任何帮助都非常值得赞赏

1 个答案:

答案 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中读取将导致其项目从数据库中读取。应该注意的是,通过读入单个实体实例,您不会错误地读取整个数据库 - 如果您有急切的集合映射,这是很常见的。