6

我知道有人问过这个问题,但我无法解决这个问题。

假设您有一个具有集合的休眠对象。

问题是,如果集合中的某些对象由不同的用户在数据库中更新(我手动修改数据库以进行测试),我似乎无法找到让 nhibernate 刷新集合值的方法。

我已经尝试过刷新、驱逐、再次加载......只有关闭会话并创建一个新的工作。但我发现这个解决方案有问题,告诉 nhibernate “老兄,刷新集合中的项目”有多难?

但无论如何我无法让它工作。

非常感谢

4

3 回答 3

1

这实际上不应该起作用,这就是为什么它不起作用。

NHibernate 默认使用会话级缓存来优化读取和跟踪修改。

听起来您没有围绕数据访问使用正确的工作单元,因为您的会话应缩小范围并仅在需要时使用。

如果这是 Web 应用程序的一部分,建议您遵循“每个请求的会话”方法。

如果你真的想让这个工作,你可能会从会话中驱逐实体和它的孩子,强制重新获取,但这很讨厌,我真的不建议这样做。

于 2012-11-20T14:54:46.417 回答
0

费尽心思试图驱逐,甚至考虑过开会和闭会。听起来您的代码中似乎有足够的空间来考虑进行过滤获取,即获取集合类型的所有项目,其中父 id 是父对象的。您可能需要扩展您的存储库或 dao,具体取决于您使用 NH 的方式,但正如其他人所说,没有示例很难更具体。要点是您在该类型的查询中获取子对象,并按父 ID 过滤。

这将是一个全新的获取,因此您将获得由其他进程创建的任何新的或更改的对象,然后您可以将该集合设置为父对象中的集合。当您尝试保存时,NH 应该克服这个问题,因为它可以对您的对象做出假设并根据需要保存或更新。如果在获取父对象和再次保存它之间可能存在一些时间延迟,这可能对您有用。

这种方法的问题是需要一种合并类型的操作。您可能希望添加在进程中创建的任何新对象,以便在更新集合时不会丢失您的更改。希望这会有所帮助,如果您仍然卡住,请给我们更多信息。

于 2012-11-21T10:54:26.853 回答
0

您应该在 SessionFactory 类中实现 IDispose 接口。

像这样:

public class YouSessionFactory : INHibernateSessionFactory, IDisposable
{
    private ISessionFactory _sessionFactory;

    //codes for initial _sessionFactory, for configuration,mapping or something else.
    //balalalalalala
    //....

    public ISessionFactory BuildSessionFactory()
    {
        return _sessionFactory;
    }

    public void Dispose()
    {
        if (!_sessionFactory.IsClosed || _sessionFactory != null)
        {
            _sessionFactory.Close();
            _sessionFactory.Dispose();
        }
    }
}
于 2013-12-04T18:27:52.657 回答