【发布时间】:2011-06-10 21:33:31
【问题描述】:
我的持久类中有一个 Set 类型的属性。我坚持到 H2 数据库。该类正确保留,我可以使用 H2 控制台查看数据并查看 Set 属性已被序列化以进行存储,这没关系,直到我尝试检索对象,我的属性始终为空。我尝试添加注释以阻止它被序列化并将其添加到默认提取组但没有成功。我想我真的不明白我需要添加哪些来阻止它被序列化。我实际上并不关心它是否被序列化,只要我可以重建 Set 并访问它的成员。
任何人都可以指出一个简单的示例,该示例使用 Datanucleus 进行持久化,带或不带序列化,以及我需要反序列化数据的任何特殊代码。
编辑:这里是一些代码,首先是我要坚持的类,
@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 (&&) 对多个字符串执行此操作(注意,这在 GAE/J 上运行良好,因此对于我的本地测试环境,我使用 Datanucleus 1.1.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:无法在序列化时查询集合/映射字段(“mseries.routes.gpx.Track.fts”)。要么更改您的查询,要么将字段更改为不被序列化。 在 org.datanucleus.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:354)【问题讨论】:
标签: jdo datanucleus