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
GO TO FULL VERSION