get() 方法

如果你想通過對象的 ID(或主鍵)獲取對象,那麼 Hibernate 有以下三種方法:

  • 加載()
  • 得到()
  • 尋找()

他們做同樣的事情,但有細微差別。get()方法的一般格式是:

EntityClass Name = session.get(EntityClass.class, Object primaryKey);

get()方法的第二個參數是它需要返回的對象的 ID(主鍵)。然後它從數據庫中加載該對象並返回它。例子:

User user = session.get(User.class, 2);

如果在數據庫中找不到具有此 ID 的記錄,則該方法將返回 null。

load() 方法

加載對象的第二種方法是load()方法。load()方法的一般格式是相同的:

EntityClass Name = session.load(EntityClass.class, Object primaryKey);

但是,它的行為不同於get()方法。

首先,這個方法不返回一個真實的對象,而是一個代理:一個虛擬存根。

其次,在使用load()方法時,沒有檢查數據庫中是否有這樣的條目。相反,Hibernate 會立即使用傳遞的 ID 創建一個代理對象並返回它。

第三,所有與數據庫的工作都將在調用代理對象的方法時發生。例如,如果您嘗試調用getName()方法,那麼將發生對數據庫的第一次調用。例子:

User user = session.load(User.class, new Integer(123));
String name = user.getName(); //this is where the first call to the database will occur

不應使用load()方法檢查數據庫中是否存在對象——它根本不會顯示這一點。此外,如果您向它傳遞一個無效 ID(例如 null),它只會返回 null。

查找() 方法

find()方法從 JPA 標準傳遞到Session接口。如您所知,該標準不僅描述了方法的簽名,還規範了行為。

此方法的工作原理與get()方法完全相同。如果傳遞的鍵未找到對象,則該方法將簡單地返回 null。

User user = session.find(User.class, -2); //method will return null

刷新() 方法

另一個與從數據庫加載對像有關的有用方法是refresh()方法。

還記得根據傳遞的對象更新數據庫中數據的persist()方法嗎?因此,refresh()方法的作用恰恰相反:它根據數據庫中的數據更新現有對象。

這種行為是必要的,例如,當將對象寫入數據庫時,會調用各種存儲過程來更正寫入的數據。

在這種情況下,如果對像有可能發生更改,從數據庫中重新讀取對象會很有用。例子:

User user = new User();
user.setName("Kolyan");
session.persist(user);
session.flush();  //Force called SQL INSERT and call triggers

session.refresh(user);
// here we continue to work with the updated object