首先,我是ORMLite的新手。我希望我的模型类有一个字段,它是一个字符串列表,最终会保存我的模型对象的标签列表。 我应该使用哪些ORMLite注释?
首先,我不想拥有所有标签的表格,然后使用@ForeignCollectionField
。
我还考虑使用@DatabaseField(dataType=DataType.SERIALIZABLE)
注释,但事实证明List<String>
没有实现Serializable
接口。
你有什么建议?
答案 0 :(得分:8)
首先,List没有实现Serializable
,但ArrayList肯定和大多数常见的集合实现一样。但是从纯对象模型的角度来看,存储一个巨大的列表可能不是最好的。
那你为什么不想要一张包含所有标签的表呢?从纯粹的模型角度来看,这是最好的方法。如果每次都需要它,它将需要第二个查询。这就是hibernate存储列表或标签数组的方式。
在阅读评论@creen后,我仍然认为你做想要一个标签表。您的模型类将具有:
@ForeignCollectionField
Collection<Tag> tags;
tags
表不有一个名为"red"
的标记,其中有多个模型类引用它,但有多个"red"
条目。它看起来像是:
model_id name
1 "red"
1 "blue"
2 "red"
3 "blue"
3 "black"
每当您删除模型对象时,您首先要执行tags.clear();
,这将从标记表中删除与该模型关联的所有标记。你不需要做任何额外的清理工作。
答案 1 :(得分:3)
无需为@ForeignCollectionField寻找简单的String Array
更改您的代码
@DatabaseField(dataType=DataType.SERIALIZABLE)
List<String> users;
到
@DatabaseField(dataType = DataType.SERIALIZABLE)
String[] users;
数据库不想存储动态增长的数组。这就是它只允许像string []这样的静态数组而不是List。
的原因答案 2 :(得分:0)
我添加了两个属性...一个以csv字符串形式写入数据库,另一个用于翻译:
[Ignore]
public List<string> Roles
{
get
{
return new List<string>(RolesCsv.Split(new char[] { ',' }));
}
set
{
RolesCsv = string.Join(",", value);
}
}
public string RolesCsv { get; set; }