【发布时间】:2012-06-14 17:07:52
【问题描述】:
我正在使用 db4o 和 JODA,但在存储/接收 DateTime 对象时遇到了问题。 至少我认为这是问题所在。
我的数据模型看起来很像这样:
DataFile.class
enum FileType {...}
further attributes... (primitve data types)
Product.class extends DataFile.class
enum ProductType {...}
further attributes... (primitve data types)
KindOfProduct.class extends Product.class
DateTime time
further attributes... (primitve data types)
我正在创建 KindOfProduct 对象并将它们存储在 EmbeddedDatabase 中。 为了查询这些对象,我使用 SODA 并得到了一个 DateTimeComparison.class 实施评估。查询 DateTime 以外的字段可以正常工作,但是 DateTime 查询失败。奇怪的是,评估方法只被调用一次,而不管我的数据库中存储了多少对象。 candidate 的 include 方法被调用 true,但候选对象不包含在 ObjectSet 中。所以似乎某处发生了错误 并且 db4o 退出而不抛出异常(这是评估 SODA 查询的一个已知问题, 从外观上看)。 使用 Eclipse 的 Object Manager Enterprise 插件查询失败。我得到一个 “无法显示结果”错误消息。
我很确定,我已经正确实现了Evaluation 接口(我已经为 与 DateTime 不同的数据类型,它工作正常)。我不认为,我需要实施 TypeHandler 用于存储 DateTime 对象,因为在其他项目中不需要这样做 我的(在那种情况下我使用的是本机查询,但我认为这不是重点)。
那么,关于如何寻找的任何想法?有什么已知的陷阱吗?
编辑:我的评估类代码
import org.joda.time.DateTime;
import com.db4o.query.Candidate;
import com.db4o.query.Evaluation;
public class DateTimeComparison implements Evaluation {
protected enum Operator {
GREATER, SMALLER, EQUAL
}
private Operator operator = null;
private DateTime value = null;
public DateTimeComparison(String operator, DateTime value) {
if (operator.equals(">")) {
this.operator = Operator.GREATER;
} else {
if (operator.equals("<")) {
this.operator = Operator.SMALLER;
} else {
this.operator = Operator.EQUAL;
}
}
this.value = value;
}
public void evaluate(Candidate candidate) {
DateTime dateTime = (DateTime) candidate.getObject();
boolean match = false;
switch (operator) {
case GREATER:
match = dateTime.compareTo(value) > 0;
break;
case SMALLER:
match = dateTime.compareTo(value) < 0;
break;
case EQUAL:
match = dateTime.compareTo(value) == 0;
break;
}
candidate.include(match);
System.out.println(match);
}
}
【问题讨论】: