1

我想用两个foreignCollections 持久化一个对象。但是当我尝试查询该对象时,我的 foreignId 始终为空。我已经阅读了这个答案,但它并没有真正帮助我:ORMLite 中的集合

VOPerception perception = new VOPerception();
perception.setOrientation(daoOrientation.createIfNotExists(
    orientationLocalizer.getCurrentOrientation()));
ForeignCollection<VOAccessPoint> fAp =
    daoPerception.getEmptyForeignCollection("accessPoints");
fAp.addAll(wifiLocalizer.getCurrentScanResultMap());    
perception.setAccessPoints(fAp);
daoPerception.create(perception);
List<VOPerception> list = daoPerception.queryForAll();

此处数据已正确存储,但 VOAccessPoint 对象与父 VOPerception 对象没有链接。

这是我的两门课:

public class VOPerception {
    @DatabaseField(generatedId=true)
    private int per_id; 

    @ForeignCollectionField(eager=true)
    ForeignCollection<VOAccessPoint> accessPoints;
    ...
}

public class VOAccessPoint{
    @DatabaseField(generatedId=true)
    private int ap_id;

    @DatabaseField(foreign=true,columnName="apForeignPerception_id")
    private VOPerception apForeignPerception;
    ...
}
4

2 回答 2

1

queryForAll()没有返回任何对象,因为您的VOAccessPoint实例都没有将其apForeignPerception字段设置为perception. 使用添加VOAccessPoint对象ForeignCollection将它们添加到 DAO,但不会自动分配它们的apForeignPerception字段。

您应该执行以下操作:

...
Collection<VOAccessPoint> points = wifiLocalizer.getCurrentScanResultMap();
for (VOAccessPoint point : points) {
    point.setApForeignPerception(perception);
}
fAp.addAll(points);
...

我可以看到您可能认为这会自动处理,但是在将它们添加到时ForeignCollectionperception甚至没有分配。我怀疑这里ORMLite缺少一个功能,或者至少是一个更好的例外。

于 2011-09-07T17:35:38.613 回答
0

我建议使用assignEmptyForeignCollection(Obj parent, fieldName). 这将创建一个新的外部集合,您将添加的所有对象都将add(Obj element)自动设置父值。

于 2014-04-03T20:24:33.747 回答