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

时间:2011-07-14 07:59:17

标签: java orm ormlite foreign-collection

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

由于我是ORM的新手,也是ORMLite的新手,我不知道当读取数据库中相同ID 的对象时,它们不会< em>使用相同的身份创建为实际上相同的对象,但是作为具有相同ID 的多个重复项。意思是,我现在面临的问题是(让我们说“ - &gt;”代表“指代”)A - &gt; B - &gt; C!= C - &gt; B - &gt;甲

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

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

编辑:

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

2 个答案:

答案 0 :(得分:3)

  

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

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

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

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

答案 1 :(得分:1)

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

  

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

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


所以在考虑了你的案例之后,我发现如果你有一个包含楼层集合的楼宇,那么集合中的每个楼层上的楼宇对象都没有理由不行。使用父Building对象设置。咄。 ORMLite拥有实现这一目标所需的所有信息。我实现了这种行为,它在版本4.24中发布。

修改

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

  

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