ORMLite – 强制读取对象具有相同的标识

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

由于我是ORM的新手,也是ORMLite的新手,我不知道当读取数据库中具有相同ID的对象时,它们不会被创建为具有相同Identity 的实际相同的对象 ,但是有几个副本具有相同的ID 。 意思是,我现在面临的问题是(让我们说“ – >”代表“指代”)A – > B – > C!= C – > B – > A.

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

是否有ORMLite本地解决方法? 如果是,那么它是什么,如果没有,解决这个问题的常用方法是什么? 这是ORM的一般问题吗? 它有名字(我想了解更多信息)吗?

编辑:

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

不幸的是,没有ORMLite本地方法来解决这个问题。 更复杂的ORM系统(例如Hibernate)具有专门用于此原因的缓存层。 ORMLite没有缓存层,所以它不知道它只是返回了一个具有相同id“最近”的对象。 这是Hibernate缓存的文档:

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

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


因此,在考虑了你的案例之后,我发现如果你有一个包含Floors集合的Building,那么就没有理由不能在集合中的每个Floors上设置Building对象。 parent构建对象。 咄。 ORMLite拥有实现这一目标所需的所有信息。 我实现了这种行为,它在4.24版本中发布。

编辑:

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

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

这是ORM的一般问题吗? 它有名字(我想了解更多信息)吗?

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

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

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