1

我正在使用 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如果父键不存在,则插入和删除的用法。

MERGEPERSIST和有什么区别ALL

  • 此外,何时建议使用fetch = FetchType

任何帮助都是非常可观的

4

1 回答 1

2

这些是单独的问题。1) 级联设置顾名思义:当您调用 entityManager 持久、合并或删除时,它会对传入的实体执行操作。然后根据映射设置,此调用将级联到引用的实体,就好像您明确调用了该方法一样在被引用的实体上。所以Project->requester,如果你在Project上调用persist,如果级联持久化或所有类型都被指定,它将在项目和请求者员工上调用persist。因此,如果员工存在但已分离,它将立即或在刷新/提交时引发异常,具体取决于您的提供者,就像您直接调用 em.persist(employee) 一样。合并和删除按照 JPA 规范概述的自身限制和行为以相同的方式操作。

CascadeType.All 只是列出所有级联类型的一种便捷方式:REMOVE、PERSIST 和 MERGE,而无需键入它们。
您应该在有意义时使用它们,而不仅仅是将每个关系都标记为 CascadeType.ALL。有很多教程可以提供帮助

2) 获取类型决定了获取发生的时间。通常建议使用惰性,这就是为什么它是 JPA 规范中集合映射的默认设置,因为引入不必要的对象会浪费资源。但这一切都取决于您的应用程序的使用模式,以及您如何优化您的提供程序、数据库和映射。使用默认值,读入项目不会导致所有引用的员工被读入,直到触发集合。但是读入一个 Employee 会导致它的项目从数据库中被读入。应该注意的是,通过读取单个实体实例,您不会错误地读取整个数据库 - 如果您有急切的集合映射,这很常见。

于 2013-07-23T14:24:16.587 回答