2

我正在使用 ORMLite 读取对象的层次结构。它的形状像一棵树,父母有一个@ForeignCollection孩子0+,每个孩子都用@DatabaseField(foreign=true). 我正在一次读取并保存整个层次结构。

由于我一般是 ORM 和 ORMLite 的新手,所以我不知道当读取数据库中具有相同 ID的对象时,它们不会被创建为具有相同 Identity的实际相同对象,但作为具有相同 ID 的几个重复项。意思是,我现在面临的问题是(假设“->”代表“指”)A -> B -> C!= C -> B -> A。

我正在考虑通过提供的 DAO 手动读取它们并通过它们的 ID 将它们放在一起来解决问题,确保具有相同 ID 的对象具有相同的身份

是否有 ORMLite-native 解决此问题的方法?如果是,它是什么,如果不是,解决这个问题的常用方法是什么?这是ORM的普遍问题吗?它有名字吗(我想了解更多)?

编辑:

我的层次结构是,一个建筑物包含多个楼层,每个楼层都知道它的建筑物,每个楼层都包含几个区域,每个区域都知道它的楼层。

4

2 回答 2

3

这是ORM的普遍问题吗?它有名字吗(我想了解更多)?

这是 ORM 的一种通用模式,被称为“身份映射”:在会话中,无论您在代码中的哪个位置从 ORM 获取映射对象,只有一个对象代表数据库中的特定行(即具有它是主键)。

我喜欢这种模式:您可以在代码的一部分中从数据库中检索某些内容,甚至对其进行修改,将该对象存储在实例变量中,等等......在代码的另一部分中,如果您掌握相同“数据库行”的对象(通过任何方式:您将其作为参数传递,您对数据库进行了批量查询,您创建了一个主键设置为相同的“新”映射对象并添加它到会话),你最终会得到相同的对象。– 甚至之前的修改(包括未刷新的)也会在那里。

(因此,将映射对象添加到会话可能会失败,并且根据 ORM 和编程语言,此添加可能会给您另一个对象返回为“相同”)

于 2011-07-22T05:29:02.747 回答
1

不幸的是,没有解决这个问题的 ORMLite-native 方法。更复杂的 ORM 系统(例如 Hibernate)具有缓存层,专门为此而存在。ORMLite 没有缓存层,因此它不知道它只是“最近”返回了具有相同 id 的对象。这是 Hibernate 缓存的文档:

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html

但是,ORMLite 被设计为 Lite,缓存层违反了 IMO 的规定。关于我在 ORMLite 中看到您的问题的唯一 [不幸] 解决方案是做您正在做的事情 - 根据 id 重建对象树。如果您提供有关您的层次结构的更多详细信息,我们可能会提供更具体的帮助。


因此,在考虑了更多@riwi 的情况之后,我突然想到,如果您有一个包含楼层集合的建筑物,那么没有理由不能将集合中每个楼层上的 Building 对象设置为父建筑对象。呃。ORMLite 拥有实现这一目标所需的所有信息。我实现了这种行为,并在 4.24 版中发布。

编辑:

ORMLite版本 4.26 开始,我们添加了一个对象缓存的初始版本,它可以支持所请求的功能。以下是文档:

http://ormlite.com/docs/object-cache

于 2011-07-14T13:53:28.817 回答