【问题标题】:db4o object update dilemmadb4o 对象更新困境
【发布时间】:2010-02-26 11:11:07
【问题描述】:

我是db4o 的新手。

我想到了这个问题: 当从DAL获取对象时,可能会在业务层更新,然后我们失去了它的原始属性,那么在更新时如何找到数据库中要更新的原始对象?

【问题讨论】:

    标签: db4o


    【解决方案1】:

    您需要更精确地了解“对象”。如果您修改对象实例的属性,只需再次存储它就会执行更新:

    MyClass someInstance = ObjectContainer.Query<MyClass>().FirstOrDefault();
    someInstance.Name = "NewName";
    someInstance.PhoneNumber = 12132434;
    ObjectContainer.Store(someInstance); // This is the update call
    

    [这只是伪代码]

    因此,您无需像使用 RDBMS 时那样相互匹配对象。

    但是,您需要确保您没有使用不同的 ObjectContainer 实例,因为不同的容器不会知道这些对象是同一个实例(因为它们中没有 ID 字段)。

    您的应用程序架构应该有助于为大多数工作流执行此操作,因此实际上应该只有一个 IObjectContainer。只有当时间跨度真的很长(例如,您需要将对象的引用存储在不同的数据库中并以某种方式处理它)时,它才会使用 UUID。正如您已经指出的那样,这需要将 ID 存储在其他地方,从而使您的架构变得复杂。

    但是,如果您打算创建一个新对象并“覆盖”旧对象,那么由于其他对象可能会引用它,事情会变得更加复杂。然而,这是一个病态的案例,通常应该在域模型本身内处理,例如通过将对象数据从一个对象复制到另一个对象。

    【讨论】:

    • 那么,您是否建议我在应用程序运行期间保持数据库打开,以便我只有一个 ObjectContainer 实例?
    • 基本上,是的。这个想法是 ObjectContainer 负责保存对象身份。因此,每当您关闭容器时,您都会丢失该信息。与您尽可能快地打开/关闭连接的典型 RDBMS 相比,db4o 容器应在您可能需要访问数据模型的所有时间保持打开状态。例如,在 Web 应用程序中,您将在请求开始时打开连接,并在请求完成时关闭它。在桌面应用程序中,您可能希望将实例保持打开更长时间。请注意,它保留引用!
    【解决方案2】:

    您应该通过其 ID 加载对象:

    objectContainer.get().ext().getByID(id);
    

    或通过其 UUID:

    objectContainer.get().ext().getByUUID(uuId);
    

    See the docs 用于后者。有关解释,请参阅答案here 或文档here。简而言之,uuid 仅用于长期引用。

    【讨论】:

    • 那么我必须将从 db 检索到的对象的 ID 存储在某处?
    • 嗯,是的。我不知道您正在使用的体系结构,但通常 id 存储在会话中而不是整个对象中,并且在下一个请求时从其 id 再次加载对象。但是正如 mnemosyn 已经指出的那样:只要您引用同一个对象,您通常就不需要 id(db4o 将随后进行更新)。也许您可以给我们一些代码来解决您遇到的问题。
    • 正如 mnemosyn 所指出的,只要对象实例和 ObjectContainer 实例相同,对象更新很容易,那么,这是否意味着我需要在生命周期内保持数据库打开我的应用程序?那么这和我们使用RDBMS的方式有很大的不同,因为RDBMS通常只为CRUD打开数据库,然后马上关闭。
    • 对不起,我不明白你的意思和需要:-(你不需要让数据库容器打开。id永远是一样的(只要你不' t 进行碎片整理)。因此您可以在不同的容器中打开一个实例 - 该实例在两个容器中将具有相同的 id!您可以使用几乎与休眠相同的方式使用 db4o。按请求模式应用流行的会话。有些日子之前我用 db4o+wicket+guice 创建了一个示例:karussell.wordpress.com/2010/01/18/… 希望这将带您进一步找到解决方案 :-)
    猜你喜欢
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 2013-09-23
    • 1970-01-01
    相关资源
    最近更新 更多