如何避免DB4o数据库中的重复对象

4
Student s1 = new Student();
        s1.rollNo = "44";
        s1.name = "kk";
db4o().save(s1);

Student s2 = new Student();
        s2.rollNo = "44";
        s2.name = "kk";
db4o().save(s2);

我在DB4o数据库中保存了两个对象s1和s2,即使它们具有重复的信息,两个对象都被保存了。我的要求是像关系数据库使用主键一样,相同学号的学生只应保存一次。我知道DB4o根据引用地址保存对象,如果我错了请指出来。请告诉我是否有办法实现主键功能以避免DB4o中的数据冗余。

谢谢

2个回答

2
db4o通过对象的标识来跟踪它们。因此,如果您使用“new”创建一个新对象,它将被视为新对象。如果您想更新一个对象,则需要获取该对象并进行更改。因此,在这里:
Student toUpdate = db4o.query(new Predicate<Student>() {
    @Override
    public boolean match(Student student) {
        return pilot.rollNo.equals("44");
    }
}).get(0);

toUpdate.name ="newName";

db4o.store(toUpdate); // Updated

这就是了。db4o总是跟踪实际对象,而不是值。
请注意,您可以添加唯一约束条件以避免错误。有关更新的更多信息,请参阅文档:http://community.versant.com/documentation/reference/db4o-8.1/java/reference/Content/basics/update_concept.htm

非常感谢您的回复,附上示例代码,它能够运行,并且我很喜欢对象比较的原生方式。 - 44kksharma

1

基本上你有两个选项:

  1. 在你的配置中添加UniqueFieldValueConstraint(在这种情况下,违规将被报告为异常)

  2. 执行一个查询(这基本上就是UniqueFieldValueConstraint将要做的),并检查数据库中是否已经存在这样的对象。

希望这能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接