在 db4o 中创建对象时限制子重复项

Posted

技术标签:

【中文标题】在 db4o 中创建对象时限制子重复项【英文标题】:Restrict child duplicates on creating object in db4o 【发布时间】:2011-11-16 03:47:36 【问题描述】:

这是一种非常常见的情况,但我在使用 ORM 时还比较陌生,尤其是在 android 中,所以你的帮助会很棒。

范围: 对象,例如消息具有另一个对象的原始字段和字段(子),例如讨论。所以它看起来像:

 public class Message 

    private int id;
    private String text;
    private Discussion discussion;

    public Message(int id, String text, int discussionId)
        this.id=id;
        this.text=text;
        discussion = new Discussion (discussionId);
    


public class Discussion 

    private int id;
    private String title;

    public Discussion(int id) 
        this.id = id;
        this.title = "Sample title";
    

注意 :: id 是服务器提供的,所以是手动设置的。

问题: 如您所知,多条消息可能属于一个讨论。但是当我存储消息列表时,我会得到带有重复讨论的表(与消息表的大小相同)。如何避免?

我如何存储消息数组列表:

ArrayList<Message> itemsList = new ArrayList<Message>;
itemsList.add(new Message(1, "Message 1", 50));
itemsList.add(new Message(2, "Message 2", 50));

ItemDBProvider dbProvider = new ItemDBProvider();

for (Item item:itemsList) 
    dbProvider.store(item);


dbProvider.getDB().commit();
dbProvider.close();

我的意思是,db4o 应该以某种方式检查 Discussion 对象是否已经在 db 中(通过“id”字段)并限制创建重复项。是真的吗?

【问题讨论】:

请注意:db4o 不是 ORM(对象关系映射器),它是一个对象数据库。这里没有“关系”。 【参考方案1】:

Db4o 不知道您打算合并不同的 Discussion 对象,因为它们具有相同的 id 字段。 Db4o 通过对象的标识(即== 运算符)来区分对象,而不是对象的任何字段。数据库中可以有数百个相同的对象。

没有理由为每个Message 创建一个新的Discussion 对象 - 检索现有的对象,并将其设置为新消息对象的discussion 字段。

【讨论】:

非常感谢您的解释。也许,我应该找到另一种将对象存储在数据库中的方法,因为这种检查前保存听起来很痛苦。 不是“保存前检查”,而是“创建前检查”。根本没有任何重复的讨论对象。 (或者不要让它们成为消息的一部分,只存储讨论 ID。但是当你需要它们时,你必须查找它们。) 是的,讨论 ID 可以处理情况,但作为一个懒惰的男孩,我希望不必为“按需获取字段对象”编写额外的代码。呵呵,再次感谢!也许我会尝试一下 ormlite,看看它如何处理字段对象的“外部”关系。 嘿!这里有同样的问题;你终于改用 Ormlite 了吗?

以上是关于在 db4o 中创建对象时限制子重复项的主要内容,如果未能解决你的问题,请参考以下文章

使用python中的构造函数限制在单例类中创建对象

发布 AWS Amplify GraphQL 突变时如何避免在数组中创建重复项

将对象插入核心数据实体时处理重复项

如何防止在 ADAM 中创建重复对象?

使用python中的构造函数限制在单例类中创建对象

JAVA中创建了多个对象,为什么只重复出现一个对象