2013-07-12 45 views
0

會話的負載似乎是無用的,如果我需要創建一個pojo,爲什麼我需要使用load來創建一個不可調用的對象?什麼是session.load用於

@Test 
public void testTwoSession() { 
    Session session = sessionFactory.getCurrentSession(); 
    session.beginTransaction(); 
    Teacher t = (Teacher) session.load(Teacher.class, 2); 
    System.out.println(t); 
    session.getTransaction().commit(); 
    System.out.println(t); 
} 

提交之前,對象將被打印,但在會議上承諾,打印操作將fail.now我很奇怪,爲什麼不直接用get方法來獲取教師目標。

回答

0

session.load()」不是無用的,它在許多情況下都是非常隨意的操作。 「load」和「get」之間的區別在於「load」創建了所謂的「代理」,它是一個臨時休眠對象,它並不真正讀取數據庫。相反,「get」方法總是讀取實際數據(如果它不存在,則返回null)。

在你的場景中,它不會產生如此大的差異(load()get()都會讀取對象),但想象一下你想要在一行中插入一個場景。在這種情況下,您將擁有做「1插入」的「load()」和做「1讀取」+「1插入」的「get()」。

+0

load()不會檢查對象是否存在。在你的場景中,如果在數據庫中有一個外鍵約束,如果該對象不存在,你將在刷新時間得到一個異常。 –

+0

,但我可能會寫一個如下所示的'Teacher findTeacher(int id);'接口,但是在提交之後會話是關閉的,也就是說,我永遠不能使用load方法來實現這個接口。 – ssj

+0

@JBNizet你是對的,沒有檢查,只有異常「ObjectNotFoundException」。 – emgsilva

0

load()方法主要是有用的,當你只想以一個實體的引用,但實際上卻並不關心它的狀態,例如,當你只是想附上這個實體另一個問題:

public void createMessageForSender(String text, String senderId) { 
    Message message = new Message(); 
    message.setText(text); 
    Sender sender = (Sender) session.load(Sender.class, senderId); 
    message.setSender(sender); 
    session.persist(message); 
} 

在上面的代碼中,你需要一個Sender實體引用來創建新的Message實體,但是你不關心它的狀態,也不需要從數據庫中加載它。因此,load()是有用的。

+0

但是如果您在加載後關閉會話,這意味着發件人無法做任何事情,這可能會導致您找不到的錯誤。 – ssj

+1

我不明白你的意思。一旦關閉會話,如果您有未加載的延遲加載的實體和關聯,瀏覽它們將導致異常。但是,如果調用者可能需要它,每次都不會加載整個數據庫。所以,如果你不需要這個狀態,你就不會加載它。如果你需要它,你加載它。就如此容易。在我的例子中,調用者甚至無法獲得對消息或其發送者的任何引用,那麼爲什麼我會加載發送者狀態? –