2013-07-23 31 views
1

我正在使用JPA 2.級聯的使用= cascadeType和fetch = FetchType

我想知道以下內容。

  • 什麼是限制插入,更新或刪除時 父項不父表中存在的最好方法。

    我有以下實體場景

    @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,PERSISTALL之間的區別是什麼?

  • 而且當它是建議使用fetch = FetchType

任何幫助是非常可觀的

回答

2

這些都是不同的問題。 1)級聯設置按顧名思義:當您調用entityManager持久化時,合併或移除它會對傳入的實體執行操作。然後根據映射設置將此調用級聯到引用的實體,就像您明確調用方法在被引用的實體上。因此,Project->請求者,如果你調用persist在Project上,它會調用persist在項目和請求者員工上,如果級聯持續或指定了所有類型的話。因此,如果員工存在但被分離,它將立即或根據您的提供者進行刷新/提交,就像直接調用em.persist(employee)一樣。合併和移除按照JPA規範概述的自己的限制和行爲以相同的方式運行。

CascadeType.All只是列出所有級聯類型的便捷方式:REMOVE,PERSIST和MERGE,而不必輸入它們。
您應該在有意義時使用它們,而不是將每個關係標記爲CascadeType.ALL。有很多教程可以幫助

2)提取類型決定何時發生提取。通常推薦使用懶惰,這就是爲什麼它是JPA規範中默認的集合映射,因爲不必要地引入對象會浪費資源。但這一切都取決於應用程序的使用模式,以及如何優化提供程序,數據庫和映射。使用默認值,讀取項目不會導致讀入所有引用的員工,直到觸發收集。但在員工中閱讀將導致其項目從數據庫中讀入。應該注意的是,通過閱讀單個實體實例,您不會錯誤地讀取整個數據庫 - 如果您有渴望的集合映射,這是很常見的。

+0

Chris我對提取類型和懶惰提取有疑問。如果我有某種延遲加載,這已經是我的前端應用程序的一部分,即我不加載數據庫中的所有記錄,它基於應用程序中顯示記錄時的記錄分頁。我的疑問是,我是否還需要啓用抓取懶惰? – user75ponic

+0

我不確定我是否理解這個問題。如果你已經啓用它,爲什麼你仍然需要啓用延遲獲取?懶惰的讀取類型設置在映射上,以防止參考實體在讀入父文件時自動讀入。如果您正在以其他方式閱讀孩子,閱讀父母仍然會導致JPA嘗試解決父母 - >孩子關係,除非他們被標記爲懶惰或未被映射。 – Chris

+0

感謝Chris的詳細解釋。 – user75ponic