我有一个 REST 服务,我从我的应用程序中调用它,该服务将一个 JSON 对象作为 a 拉入byte[]
,然后将其转换为一个很好的嵌套对象集合——所有这些都可以正常工作。然后我想做的是使用 OrmLite 将这些对象保存到 SQLite 存储中,这就是事情开始崩溃的地方,因为据我所知,OrmLite 不会自动保存嵌套对象。
为简单起见,让我们去掉我的实际功能,让我的对象简单地建模如下:
@DatabaseTable(tableName = "parents")
public class Parent {
@DatabaseField(id=true)
private String name;
@ForeignCollectionField
// have to use Collection here because needs to be compatible with Jackson
private Collection<Child> children;
/* Getters and setters go here */
}
@DatabaseTable(tableName = "children")
public class Child {
@DatabaseField(id=true)
private String name;
@DatabaseField(foreign=true)
private Parent parent;
/* Getters and setters go here */
}
Parent
发生的情况是,当使用我的相应对象在数据库中添加创建新对象时parentDao
,子级不会与父级一起持久化。
这是一个常见问题,之前已经提出过,在 SO 上肯定还有其他问题与这个问题非常相似,最值得注意的是在 Android 上使用 ORMLite 保存嵌套的外部对象,以回答 Gray 建议在父对象之前创建子对象可以很好地手动创建我的 POJO。
但是,我还没有看到在对象由另一个库(在本例中为杰克逊)生成的情况下会影响哪些因素的答案。没有深入挖掘杰克逊的反序列化内部(这消除了其简单性的全部好处)并试图让杰克逊创建子对象,然后将它们添加到父对象(除非我错过了一些东西,这比听起来容易吗?)在这种特殊情况下,这似乎不是一个特别有吸引力的解决方案。
同样,还有其他解决方案涉及向外键添加更多注释,这些注释似乎适用于处理单个子对象,但在使用@ForeignCollectionField
s 及其对应Collection
的 s 时这些注释不可用。