我正在处理的应用程序使用session.load()按标识符执行所有查询。鉴于它无法找到标识符并引发异常时引起的混乱,我正在考虑将其交换到session.get()。但在我这样做之前,它是系统的一个基本部分,我想确保两种方法之间绝对没有其他区别。是否有任何理由可以考虑为什么原始开发人员会因处理无效ID而选择load()而不是get()而?
编辑:如上所述,我完全知道get返回false并且load抛出异常。我在问他们是否有其他方式不同。
答案 0 :(得分:2)
是不是因为Get从不返回代理,而Load会这样做?
我认为这很重要:
为什么这有用?好吧,如果你知道的话 该值存在于数据库中, 而且你不想支付额外的费用 选择那个,但你想要 获得该值,以便我们可以添加它 引用一个对象,你可以使用 加载这样做: 上面的代码不会导致a 选择数据库,但是当我们 提交交易,我们将设置 CustomerID列为1.这是 NHibernate如何维护OO外观 什么时候给你相同的优化 与...直接合作的好处 低级API。
来自NH 2.0参考文档:
请注意,Load()将抛出一个 不可恢复的例外,如果没有 匹配数据库行。如果是这样的 使用代理映射,Load()返回一个 对象是未初始化的代理 并没有真正打到数据库 直到你调用一个方法 宾语。这种行为非常有用 如果你想创建一个协会 没有实际加载的对象 它来自数据库。
如果您不确定是否匹配 行存在,你应该使用Get() 方法,它命中数据库 立即返回null,如果有的话 是没有匹配的行。
答案 1 :(得分:0)
像往常一样,最好的参考是documentation:
Session.get()
:
返回给定实体类的持久化实例,使用给定标识符,如果没有此类持久性实例,则返回null 。 (如果实例或实例的代理已与会话关联,则返回该实例或代理。)
Session.load()
:
返回具有给定标识符的给定实体类的持久化实例,假设该实例存在。
您不应该使用此方法来确定是否存在实例(改为使用get())。仅使用它来检索您认为存在的实例,其中不存在将是实际错误。
因此,不同之处在于处理不存在的实例的方式。
答案 2 :(得分:0)
一种好的方法如下所示
如果需要调用getter方法,请使用get方法。 get方法命中数据库。
public class AccountServiceImpl implements AccountService {
private SessionFactory sessionFactory;
public BigDecimal getBalance(Integer acountId) {
// You need to know your balance
// So you need to use get method to access the database
Account account = (Account) sessionFactory.getCurrentSession().get(Account.class, accountId);
return account.getBalance();
}
}
如果您需要同时调用getter和setter方法,请使用get方法。
回应ChssPly的评论:
JPA与Hibernate的书谈到了加载方法
load()方法总是尝试返回代理,并且只有在已经由当前持久化上下文管理的情况下才返回初始化对象实例。
和
一旦您尝试访问返回的占位符并强制其初始化
,它就会立即命中数据库
因此,当你设置一个属性时,他是对的。
但JPA中使用Hibernate一书
显示了以下场景获取持久化实例以将其指定为对另一个实例的引用是很常见的。例如,假设您只需要将该项目用于单一目的:设置与Comment的关联:aComment.setForAuction(item)。
如果这是您打算对该项目进行的所有操作,代理将会运行良好;没有必要 点击数据库。换句话说,当保存Comment时,您需要插入COMMENT表中的项的外键值。
Item的代理提供了:包含在占位符中的标识符值,看起来像真实的东西。
的问候,
答案 3 :(得分:0)
查看此帖子,选择正确答案的答案将解释所有内容。