Nhibernate QueryOver不会获得最新的数据库更改

Car*_*los 5 nhibernate nhibernate-criteria queryover

我正在尝试从数据库更新记录QueryOver.我的代码最初创建一个实体并保存在数据库中,然后在外部数据库上更新相同的记录(从其他程序,手动或在其他机器上运行的相同程序),当我queryOver通过字段更改调用过滤时,查询得到记录,但没有最新的变化.

这是我的代码:

//create the entity and save in database
MyEntity myEntity = CreateDummyEntity();
myEntity.Name = "new_name";

MyService.SaveEntity(myEntity);

// now the entity is updated externally changing the name property with the 
// "modified_name" value (for example manually in TOAD, SQL Server,etc..)

//get the entity with QueryOver
var result = NhibernateHelper.Session
                 .QueryOver<MyEntity>()
                 .Where(param => param.Name == "modified_name")
                 .List<T>();
Run Code Online (Sandbox Code Playgroud)

前一个语句获取的集合只有一个记录(好),但是使用旧值而不是"modified_name" 建立了name属性.

我怎么能解决这个问题?一级缓存令我不安?出现同样的问题

CreateCriteria<T>();
Run Code Online (Sandbox Code Playgroud)

我的NhibernateHelper中的会话在任何时候都没有因应用程序框架要求而关闭,只是为session.Save()关联的每个提交创建了事务.如果我打开一个新会话来执行查询显然我从数据库中获得了最新的更改,但设计要求不允许这种方法.

此外,我已经在NHibernate SQL输出中检查了正在执行带有WHERE子句的select(因此Nhibernate命中数据库)但是不更新返回的对象!

UPDATE

这是调用session.Save之后SaveEntity中的代码:完成对Commit方法的调用

public virtual void Commit() 
{ 
  try 
  { 
    this.session.Flush(); 
    this.transaction.Commit();
  } 
  catch 
  { 
    this.transaction.Rollback(); 
    throw; 
  } 
  finally 
  { 
    this.transaction = this.session.BeginTransaction();
  } 
}
Run Code Online (Sandbox Code Playgroud)

NHibernate为SaveEntity生成的SQL:

NHibernate: INSERT INTO MYCOMPANY.MYENTITY (NAME) VALUES (:p0);:p0 = 'new_name'. 
Run Code Online (Sandbox Code Playgroud)

NHibernate为QueryOver生成的SQL:

NHibernate: SELECT this_.NAME as NAME26_0_ 
            FROM MYCOMPANY.MYENTITY this_ 
            WHERE this_.NAME = :p0;:p0 = 'modified_name' [Type: String (0)]. 
Run Code Online (Sandbox Code Playgroud)

由于公司机密政策,查询已被修改.

非常感谢.

Car*_*los 0

经过搜索、搜索、思考、思考...我\xc2\xb4ve找到了解决方案。

\n\n

修复:打开一个新的会话,QueryOver<T>()在该会话中调用,数据刷新成功。如果您的子集合未初始化,您可以在映射中调用HibernateUtil.Initialize(entity)或设置。lazy="false"在大型集合中要特别小心lazy="false",因为你可能会得到很差的性能。要解决此问题(加载大型集合的性能问题),请lazy="true"在集合映射中设置并调用HibernateUtil.Initialize(entity)受影响集合的上述方法以从数据库获取子记录;例如,您可以获取表中的所有记录,如果您需要访问特定实体的所有子记录,则HibernateUtil.Initialize(collection)仅调用感兴趣的对象。

\n\n

注意:正如@martin ernst所说,更新问题可能是hibernate中的一个错误,我的解决方案只是临时修复,必须在hibernate中解决。

\n