Jon*_*lis 55 java orm android jackson ormlite
我有一个REST服务,我正在从我的应用程序调用,它将一个JSON对象作为一个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 */
}
Run Code Online (Sandbox Code Playgroud)
发生的情况是,在Parent使用我的相应parentDao对象添加在数据库中创建新对象时,子项不会与父项一起保留.
这是一个常见的问题并且之前已经提出过,在SO上肯定还有其他问题与这个非常类似,最值得注意的是在Android上用ORMLite保存嵌套的外来对象,以回答Gray建议在父对象之前创建子对象的问题.可以正常手动创建我的POJO.
但是,我还没有看到一个答案,这些因素是由另一个库(在本例中为Jackson)生成对象的情况.没有深入挖掘杰克逊的反序列化内部(它消除了其简单性的全部好处)并试图让杰克逊创建子对象然后将它们添加到父对象(除非我遗漏了一些东西,这比听起来容易吗?)在这种特殊情况下,这似乎不是一个特别有吸引力的解决方案.
同样,还有其他解决方案涉及向外键添加更多注释,这些注释似乎适合处理单个子对象,但在使用@ForeignCollectionFields及其相应的Collections 时,这些注释不可用.
小智 1
您可能想尝试在父类中使用ForeignCollection 而不是Collection。
来自 ORMLite 文档:
“外部集合支持 add() 和 remove() 方法,在这种情况下,如果集合是急切的,则对象将被添加到内部列表或从内部列表中删除,并且 DAO 调用也会影响 [child] 表适合热衷和懒惰的收藏。”
(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#add(T))
不过,我从来没有处理过这个问题,所以我只是希望文档是正确的,这可以帮助您解决问题。:-)
| 归档时间: |
|
| 查看次数: |
1814 次 |
| 最近记录: |