當我們調用session.get()方法時,hibernate將命中數據庫並返回原始對象。session.load()方法如何在不觸及數據庫的情況下提取數據?
當您調用session.load()方法時,它將始終返回一個「代理」對象而不查詢數據庫。
我的問題是如果load()方法沒有命中數據庫,那麼它如何知道請求的信息是否在數據庫中可用。
當我們調用session.get()方法時,hibernate將命中數據庫並返回原始對象。session.load()方法如何在不觸及數據庫的情況下提取數據?
當您調用session.load()方法時,它將始終返回一個「代理」對象而不查詢數據庫。
我的問題是如果load()方法沒有命中數據庫,那麼它如何知道請求的信息是否在數據庫中可用。
假設你有父子關聯。例如,有一個主表。您正在將一個對象的引用注入其他對象。
考慮一個學生課。許多學生屬於同一個學校標準。
這裏標準和學生之間會產生一對多的關係。
現在,當保存學生對象時,您將需要標準的持久對象。
你必須堅持學生對象,如下:
student.setStandard(standard);
現在,你有標準對象的主鍵。而且你知道這個標準已經存在於數據庫中。現在考慮它是一個主表。因此,而不是實際進入數據庫,你這是傻瓜已經有一個目標:
Standard standard = session.load(Standard.class, id);
,因爲Hibernate不會碰到數據庫,它會創建將在您的學生對象注入一個代理對象。當你在那個時候會打電話給session.save(學生)時,它將被保存。
但是,假設您使用load()方法加載標準對象。如果你會嘗試調用像standard.getClassTeacher()那樣的任何方法,那麼它實際上會碰到數據庫,如果它在db中找不到,那麼它會拋出錯誤。
直到你真的嘗試閱讀它。 –
那麼使用load()有什麼好處?我正在尋找get()和load()之間的區別,但上下文就是這個地方。 – sNegi
不,這不是JPA API,所以請不要將它標記爲 –