我的persistable类中有一个Set类型的属性。我坚持使用H2数据库。该类保持正确,我可以使用H2控制台查看数据,并看到Set属性已被序列化以进行存储,这是正常的,直到我尝试检索对象,我的属性始终为null。我已经尝试添加注释以阻止它被序列化并将其添加到默认的提取组但没有成功。我想我真的不明白我需要添加哪些来阻止它被序列化。只要我可以重建Set并访问它的成员,我实际上并不关心它是否被序列化。
有人能指出一个简单的例子,说明使用带有或不带序列化的Datanucleus持有的Set以及我需要对数据进行反序列化的任何特殊代码。
编辑:这是一些代码,首先是我要坚持的类,
@PersistenceCapable
public class Track {
private Set<String> fts;
private String name="";
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setFts(Set<String> fts) {
this.fts = fts;
}
public Set<String> getFts() {
return fts;
}
}
我的orm文件中的摘录
<class name="Track" identity-type="datastore" table="JDO_TRACK">
<inheritance strategy="new-table"/>
<field name="name" primary-key="true">
<column jdbc-type="VARCHAR" name="name"/>
</field>
<field name="fts" default-fetch-group="true" persistence-modifier="persistent">
<collection element-type="java.lang.String" dependent-element="true" serialised-element="false"/>
<element column="fts"/>
</field>
</class>
和我查询数据存储区的方法,我想在fts属性中获取具有特定值的Track对象。这个示例查询一个字符串,但在现实生活中,我需要在一个以上的AND(&amp;&amp;)上做这个(NB这在GAE / J上很好用,所以对于我的本地测试环境,我使用Datanucleus 1.1 0.5)
private Track retrieveFTS(String criteria) {
PersistenceManagerFactory pmf = JDOHelper
.getPersistenceManagerFactory("datanucleus.properties");
PersistenceManager pm = pmf.getPersistenceManager();
Track res = null;
try {
System.out.println("Querying with criteria:" + criteria);
Query q = pm.newQuery(mseries.routes.gpx.Track.class);
q.setFilter("fts.toUpperCase() == criteria ");
q.declareParameters("String criteria");
q.setUnique(true);
q.setOrdering("name ascending");
res = (Track) q.execute(criteria.toUpperCase());
} finally {
pm.close();
}
return res;
}
和我收到的例外
javax.jdo.JDOFatalUserException: Impossible to query a collection/map field ("mseries.routes.gpx.Track.fts") when it is serialised. Either change your query, or change the field to not be serialised. at org.datanucleus.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:354)
答案 0 :(得分:0)
如果在GAE / J环境中使用,那么您最好将问题标记为。 如果在GAE / J之外使用,那么你没有理由使用如此古老的不支持的DataNucleus版本,即使用v3.0
如果您不希望Set序列化,那么最好建议您包含&lt; join /&gt;因为否则你不允许它连接表,因此它必须序列化