我有一个REST服务,我从我的应用程序调用,它拉入一个JSON对象作为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
对象时,子对象不与父对象一起持久化。
这是一个常见的问题,以前已经提出过,肯定有其他的问题,这是非常类似的一个,最值得注意的是保存嵌套的外部对象与ORMLite在Android上的回答,Gray建议创建父对象之前的子对象,这将很好地创建我的pojo手动。
然而,我还没有看到一个答案,在对象是由另一个库(在本例中是Jackson)生成的情况下,哪些因素会起作用。如果不深入挖掘Jackson的反序列化内部(这会消除其简单性的全部好处),并试图让Jackson创建子对象,然后将它们添加到父对象(除非我遗漏了什么,这比听起来容易?),在这种特殊情况下,这似乎不是一个特别有吸引力的解决方案。
同样,还有其他解决方案,包括向外键添加进一步的注释,这些注释似乎适用于处理单个子对象,但这些注释在使用@ForeignCollectionField
s及其相应的Collection
s时不可用。
你可以尝试在父类中使用ForeignCollection而不是Collection。
来自ormlife - documentation:
"外部集合支持add()和remove()方法,在这种情况下,如果集合是动态的,对象将被添加或从内部列表中删除,并且对于动态集合和惰性集合,DAO调用也将影响[子]表。"
(http://ormlite.com/javadoc/ormlite-core/doc-files/ormlite_2.html # Foreign-Collection)
在类本身的文档中也声明添加/删除被转发到数据库。(http://ormlite.com/javadoc/ormlite-core/com/j256/ormlite/dao/ForeignCollection.html添加(T))
我从来没有处理过这个,虽然,所以我只是希望文档是正确的,这有助于你解决你的问题。: -)