休眠,混合负载与标准可能吗?

时间:2011-05-18 14:08:12

标签: hibernate generics

是否可以将session.load(class, id)与灵活标准(标准api)混合使用?

我需要类似的东西:

select * from entity where id = 1 AND name = 'miller'

我使用通用方法进行id的查找:

public T findById(ID id, boolean lock) {
    T entity;
    if (lock)
        entity = (T) getSession().load(getPersistentClass(), id, LockMode.UPGRADE);
    else
        entity = (T) getSession().load(getPersistentClass(), id);

    return entity;
}

并希望通过

进行扩展
    Criteria criteria = session.createCriteria(getPersistentClass());
    criteria.add( Restrictions.eq("name", "miller"));

where ("name", "miller")将替换为通用的。

1 个答案:

答案 0 :(得分:0)

加载和标准不能混用。如果实例尚未在缓存中,则Load会创建代理。 load(和get)的目的是它的参数是缓存的密钥(类和id),它不需要在之前刷新会话。 Criteria是一种查询。当您已经知道id时,您不再需要查询。我的意思是,id = 1 AND name = 'miller'是否有意义?


只要写下你自己的“获取”:

public TEntity secureGet<TEntity>(int id, string user)
{
  // avoid flushing, only when you never expect that the user name
  // in the object to be loaded has changed within the current session.
  // this is very performance relevant.
  session.flushMode = FlushMode.Never;
  return session
    .createCriteria(typeof(TEntity))
    .add( Restrictions.idEq(id))
    .add( Restrictions.eq("name", user))
    .UniqueResult<TEntity>();
  session.flushMode = FlushMode.Auto;
}

(抱歉可能存在语法错误,我不是java程序员)