2014-02-16 62 views
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,即使他们有重复的信息被保存,我要的是同rollNo学生只能用一次保存就像使用主键的关系数据库一样。我知道DB4o根据参考地址保存对象,如果我错了,请纠正我。请让我知道是否有任何方法可以实现主键功能,以避免DB4o中的数据冗余。如何避免db4o中的数据库复制对象

感谢

回答

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 allway跟踪实际对象。不是价值。

请注意,您可以add unique constrains以避免错误。有关更新的更多信息,请参阅文档:http://community.versant.com/documentation/reference/db4o-8.1/java/reference/Content/basics/update_concept.htm

+0

非常感谢您对示例代码的回复,它的工作原理和我喜欢本地对象比较的方式。 – 44kksharma

1

基本上,你有2种选择:

  1. 添加UniqueFieldValueConstraint到您的配置(在这种情况下,违规行为将被报告为例外)

  2. 执行查询(这是基本上UniqueFieldValueConstraint会做什么),并检查这个对象是否已经存在于数据库中。

希望这会有所帮助。

+0

非常感谢您的回复,它的功能非常棒。 – 44kksharma