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