Java Db4o恢复缓存对象

Java Db4o恢复缓存对象,java,db4o,Java,Db4o,我使用的是db4o8.1的嵌入式版本。问题是,当我检索一个对象并只调用一个属性集时,它似乎在缓存中持久化该值,而随后的检索即使在我尝试按ID检索时也会给我相同的引用 下面的代码用于从db检索对象 public Customer retrieveCustomer(final String id) { ObjectContainer db = getDataSource(); Customer customer = null; try { List<Cu

我使用的是db4o8.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;
}
这里一切正常,但当再次从db检索对象时,它会给我xyz而不是“abc”,因为我没有存储或提交上一个对象

当我重新启动服务器(关闭并打开数据库)时,旧值将恢复


请帮助。

对于db4o新手来说,这是一个非常常见的错误:)

问题是,一旦在会话中检索到,db4o将保留对该对象的引用(每当Store()实际上是一个Store或update时,它就是这样理解的);因此,第二次从db中获取对象时,db4o将找到缓存的对象并返回它(您可以阅读更多关于这个和其他概念的内容)

解决方案是什么?取决于您的需要,但您可以:

  • 对返回的对象进行克隆并更新此克隆
  • 使用数据库(db4o对嵌入式客户机进行了一些优化)

如果您是db4o新手,我推荐。

谢谢Vagaus,这解决了我的问题,是任何使用db4o的人必须知道的:)
customer.setName("xyz"); // no commit or store