0

在我使用 hibernate 之前,我有幸在Process 范围的身份环境中工作。这意味着当我从数据库中获取 2 次相同的对象时,它们总是 == 。

在我搬到 hibernate 之前,我曾经通过保留一个HashMap唯一的实例来实现这一点。每次获取结果集时,我都会检查此映射中的先前实例,以便返回相同的对象实例。为了避免内存泄漏并帮助垃圾收集器,我会先将这些唯一实例包装在WeakReference对象中,然后再将它们放入映射中。

我(从这个有 10 年历史的框架)迁移到休眠状态,以确保我跟上最新的 Java 技术。我错误地认为hibernate现在会支持这个开箱即用的。当然,我很想再次实现自己的缓存。但我的目标实际上是用最少的自写代码来设置我项目的核心。

实际上,大多数网站都试图说服我根本不要使用进程范围标识,因为它应该是一件危险的事情(死锁,...)。老实说,我有点怀疑,我很确定我能做到。

我目前正在考虑让 process-scoped-identity 在我身后,但看起来有很多后果。例如:过去我有时将信息(在运行时计算)存储在瞬态字段中。当然,现在这已经不可能了。

一些网站写道,使用EHCache 框架可以达到进程范围的身份。我试过但还没有成功。默认情况下,它显然是关闭的,我没有找到任何关于如何激活它的示例。

一些建议非常受欢迎。

编辑:(更具体地说)

  • Process Scoped Identity使用 Hibernate 时是否可以完成?
  • 如果是这样,这是一种好的做法,如何实现?
4

1 回答 1

3

实际上,在给定的 Hibernate session 中,Hibernate 支持开箱即用的实现。

在多个会话(以及事务)之间共享一个唯一实例没有任何意义,因为这会破坏事务提供的 ACID 功能,并使其完全无用,除非只有一个用户访问数据库。例如,存储在内存中的瞬态字段将完全不正确,因为数据在数据库中被修改而没有经过这个唯一的内存实例。如果某些约束被破坏并导致事务回滚,那么您的唯一实例中会留下不正确的值,这些值与存储在数据库中的数据的实际情况完全脱节。

于 2013-08-11T12:49:11.873 回答