摘要:
Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象。其区别在于: 如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException。load()方法可返回实体的代理类实例,而get方法永远直接返回实体类。考虑如下的一个拍卖应用的例子:
拍卖物件对象: Item
拍卖行为: Bid
Session session = << Get session from SessionFactory >>
Long itemId = << Get the item id from request >>
Item item = (Item) session.get(Item.class, itemId);
if(item != null) {
Bid bid = new Bid();
bid.setItem(item);
session.saveOrUpdate(bid);
}
else
{
log.error("Bid placed for an unavailable item");
// Handle the error condition appropriately
}
这种代码虽然可行,但是有局限性, 可以通过以下方法改进:
Session session = << Get session from SessionFactory >>
Long itemId = << Get the item id from request >>
try{
Item item = session.load(Item.class, itemId);
Bid bid = new Bid();
bid.setItem(item);
session.saveOrUpdate(bid);
}
catch(ObjectNotFoundException e) {
log.error("Bid placed for an unavailable item");
// Handle the error condition appropriately
}
在这个例子里, 通过load()来查询Item, 如果没有找到, 则会抛出ObjectNotFoundException 而不是返回null, 这使得处理代码更加的优雅.
Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象。其区别在于:
如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException。
load()方法可返回实体的代理类实例,而get方法永远直接返回实体类。
load方法可以充分利用内部缓存和二级缓存中的现有数据,而get方法则仅仅在内部缓存中进行数据查找,如没有发现对应数据,将越过二级缓存,直接调用SQL完成数据读取。
而Joseph Ottinger提到: 随着Hibernate完全实现JPA, Hibernate将会通过EntityManager来提供cache, 从而使得这个使用load()的技巧略微无效? 你是如何看待呢?
本页页面地址:
用户评论列表
这种简单的技巧也拿出来做标题新闻......
而且这篇文章应该归类为[文章]更合适,而不是[新闻]。
Stive,又是你,不过支持,这个不是新闻吧
不过确实是个好东东,没看之前还真的不知道会有区别。支持
感谢matrix,弄了这么好一个tips
TSS上的一则“新建” ^_^
TSS上的一则“新闻” ^_^
很好哦,谢谢,我以前只用get没用过load,更不知道区别了,现在该用用了
错误 误导人
谁说get不会查询二级缓存
我看过源代码 get会先查session缓存没有就查询二级缓存
最后查询数据库
无论get还是load都会调用DefaultLoadEventListener类中的方法
load--》doLoad doLoad源代码:
if ( log.isTraceEnabled() ) {
log.trace(
"attempting to resolve: " +
MessageHelper.infoString( persister, event.getEntityId(), event.getSession().getFactory() )
);
}
Object entity = loadFromSessionCache(event, keyToLoad, options);
if ( entity != null ) {
if ( log.isTraceEnabled() ) {
log.trace(
"resolved object in session cache: " +
MessageHelper.infoString( persister, event.getEntityId(), event.getSession().getFactory() )
);
}
return entity;
}
// Entity not found in session; before going any further, see if we
// already determined that this entity does not exist
/*if ( event.getSession().getPersistenceContext().isNonExistant(keyToLoad) ) {
if ( log.isTraceEnabled() ) log.trace("entity does not exist");
return null;
}*/
entity = loadFromSecondLevelCache(event, persister, options);
if ( entity != null ) {
if ( log.isTraceEnabled() ) {
log.trace(
"resolved object in second-level cache: " +
MessageHelper.infoString( persister, event.getEntityId(), event.getSession().getFactory() )
);
}
return entity;
}
if ( log.isTraceEnabled() ) {
log.trace(
"object not resolved in any cache: " +
MessageHelper.infoString( persister, event.getEntityId(), event.getSession().getFactory() )
);
}
return loadFromDatasource(event, persister, keyToLoad, options);
发表我的评论 (评论可增加个人积分...)
| 用户*: | E-mail: | ||
| 评论内容*: 支持BBCode |
|||
| 算术题*: | + = | ||

ICP:?B2-20040367