У меня есть атрибут типа Set в моем постоянном классе. Я настаиваю на базе данных H2. Класс сохраняется правильно, и я могу просматривать данные с помощью консоли H2 и видеть, что атрибут 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;
}
}
Выписка из моего файла
<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>
и мой метод запроса хранилища данных, я хочу получить объекты Track с конкретными значениями в атрибуте fts. Этот пример запрашивает одну строку, но в реальной жизни мне нужно будет выполнить более одного с AND (&&) (NB. Это хорошо работает на 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: 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)