【问题标题】:DB4o update vs insertDB4o 更新与插入
【发布时间】:2013-09-23 12:38:23
【问题描述】:

假设您使用的是标准配置和开箱即用的 DB4O - 也就是说,您使用的是 DB4O 的标准内部 id 方案,如下所示**。

首先,作为一个假设,当更新或插入一个对象到数据库时,程序员只有一个选择,调用“objectContainer.store(object)”。

现在,DB4O 如何知道是更新数据库中的现有对象,还是插入一个全新的对象?我的猜测是,DB4O 会查看对象的内部 id 是否不为空。

但是,我也可以看到程序员有可能首先从数据库中提取对象,然后更新它。 所以我的问题是,我们如何才能可靠地更新 DB4O 数据库中的对象,而无需先将其拉入 Java 内存?

*这篇 DB4O 文章并没有真正回答我的问题

http://community.versant.com/Documentation/Reference/db4o-8.1/java/reference/Content/basics/update_concept.htm

**这是非常有用的:

http://community.versant.com/documentation/Reference/db4o-8.1/java/reference/Content/platform_specific_issues/disconnected_objects/comparison_of_ids.htm

【问题讨论】:

    标签: persistence db4o object-oriented-database


    【解决方案1】:

    db4o 使用对象标识来决定是否插入/更新对象(AFAIK 这是 db4o 中的一个中心概念),因此,即使有可能,也没有简单的方法可以在 db4o 级别实现(您可能有数据层访问的抽象;您可以做的是在这一层有两个方法:插入和更新;在更新中,在调用 db4o.store() 之前,您可以检查对象是否已经加载。这个这样,至少您可以避免导致数据库中对象重复的错误。如果您在插入中执行相同的操作,则可以确保不会错误地更新对象。

    希望对您有所帮助。

    【讨论】:

    • 感谢瓦高斯。我想每个模型对象只会有一个额外的布尔值。如果我从数据库中提取对象,则保存 = true,如果我在 Java 中创建对象,则保存 = false。可能就这么简单。
    • 我理解你的抽象层想法,但问题是在核心你只有一个方法,即 store(object),因此,你所能做的就是确保你存储了 正确的 对象。在我看来,确保您拥有正确对象的方法是自己标记来自数据库的对象。但是,我很想知道 DB4O 是否用内部 id 标记这些对象。所以我不确定我是否需要保存的布尔值,只需检查内部 id 是否为空。
    • 话虽如此,DB4O 不应该知道如果一个对象的内部 id 不为空的话,它已经从数据库中加载了......?
    • @Alex,这正是我的建议(让 db4o 告诉你它是否知道该对象)。您可以使用 ExtObjectContainer 接口中的 getID() 方法 (community.versant.com/documentation/reference/db4o-8.0/java/api/… 您将执行以下操作:db.ext().getID(myObj)
    猜你喜欢
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多