在 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 中创建对象时限制子重复项的主要内容,如果未能解决你的问题,请参考以下文章