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