我知道有人问过这个问题,但我无法解决这个问题。
假设您有一个具有集合的休眠对象。
问题是,如果集合中的某些对象由不同的用户在数据库中更新(我手动修改数据库以进行测试),我似乎无法找到让 nhibernate 刷新集合值的方法。
我已经尝试过刷新、驱逐、再次加载......只有关闭会话并创建一个新的工作。但我发现这个解决方案有问题,告诉 nhibernate “老兄,刷新集合中的项目”有多难?
但无论如何我无法让它工作。
非常感谢
我知道有人问过这个问题,但我无法解决这个问题。
假设您有一个具有集合的休眠对象。
问题是,如果集合中的某些对象由不同的用户在数据库中更新(我手动修改数据库以进行测试),我似乎无法找到让 nhibernate 刷新集合值的方法。
我已经尝试过刷新、驱逐、再次加载......只有关闭会话并创建一个新的工作。但我发现这个解决方案有问题,告诉 nhibernate “老兄,刷新集合中的项目”有多难?
但无论如何我无法让它工作。
非常感谢
这实际上不应该起作用,这就是为什么它不起作用。
NHibernate 默认使用会话级缓存来优化读取和跟踪修改。
听起来您没有围绕数据访问使用正确的工作单元,因为您的会话应缩小范围并仅在需要时使用。
如果这是 Web 应用程序的一部分,建议您遵循“每个请求的会话”方法。
如果你真的想让这个工作,你可能会从会话中驱逐实体和它的孩子,强制重新获取,但这很讨厌,我真的不建议这样做。
费尽心思试图驱逐,甚至考虑过开会和闭会。听起来您的代码中似乎有足够的空间来考虑进行过滤获取,即获取集合类型的所有项目,其中父 id 是父对象的。您可能需要扩展您的存储库或 dao,具体取决于您使用 NH 的方式,但正如其他人所说,没有示例很难更具体。要点是您在该类型的查询中获取子对象,并按父 ID 过滤。
这将是一个全新的获取,因此您将获得由其他进程创建的任何新的或更改的对象,然后您可以将该集合设置为父对象中的集合。当您尝试保存时,NH 应该克服这个问题,因为它可以对您的对象做出假设并根据需要保存或更新。如果在获取父对象和再次保存它之间可能存在一些时间延迟,这可能对您有用。
这种方法的问题是需要一种合并类型的操作。您可能希望添加在进程中创建的任何新对象,以便在更新集合时不会丢失您的更改。希望这会有所帮助,如果您仍然卡住,请给我们更多信息。
您应该在 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();
}
}
}