我正在使用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(“ xyz”);从“ abc”的原始值开始,我不在任何地方提交。
customer.setName("xyz"); // no commit or store
一切都很好,但是当再次从数据库中检索对象时,它给了我xyz而不是“ abc”,因为我没有存储或提交前一个对象。
当我重新启动服务器(关闭并打开数据库)时,恢复了旧值
请帮忙。
最佳答案
对于db4o新手来说,这是一个很常见的错误:)
问题是,一旦在会话中检索到,db4o将保留对该对象的引用(这是只要Store()实际上是商店或更新对象,它就可以弄清楚它的方式);因此,第二次从db获取对象时,db4o将找到已缓存的对象并将其返回(您可以了解有关此内容以及其他概念的更多信息,here)。
解决方案?取决于您的需求,但是您可以:
克隆返回的对象并更新此克隆
Open multiple sessions与数据库一起使用(db4o对嵌入式客户机进行了一些优化)。
如果您不熟悉db4o,建议使用reading this documentation。
关于java - db4o重现缓存的对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22459227/