我使用的是db4o 8.1的嵌入版本。问题是,当我检索一个对象并且只调用一个属性集时,它似乎是在缓存中持久保存,后续检索即使在我尝试通过ID检索时也给出了相同的引用。
以下代码用于从db中检索对象。
public Customer retrieveCustomer(final String id) {
ObjectContainer db = getDataSource();
Customer customer = null;
try {
List<Customer> result = db.query(new Predicate<Customer>() {
private static final long serialVersionUID = 1L;
public boolean match(Customer pilot) {
return pilot.getId().equalsIgnoreCase(id);
}
});
if (result.size() > 0) {
customer = result.get(0);
}
}
catch (Exception e) {
logger.error("Internal db failed to retrieve the object.", e);
}
return customer;
}
在代码的某处我做setName(&#34; xyz&#34;);来自&#34; abc&#34;的原始价值我不会在任何地方提交。
customer.setName("xyz"); // no commit or store
这里的一切都很好,但是当从db再次检索对象时,它给了我xyz而不是&#34; abc&#34;因为我没有存储或提交上一个对象。
当我重新启动服务器(关闭并打开数据库)时,将恢复旧值
请帮忙。
答案 0 :(得分:1)
对于db4o新手来说,这是一个非常常见的错误:)
问题在于,一旦在会话中检索到,db4o将保留对该对象的引用(即当Store()确实是存储或更新时它是如何计算出来的);因此,第二次从db获取对象时,db4o将找到缓存的对象并返回它(您可以阅读更多有关此内容以及其他概念here)。
解决方案?取决于您的需求,但您可以:
如果您是db4o的新手,我建议reading this documentation。