#jdo #datanucleus
#jdo #datanucleus
Вопрос:
У меня есть атрибут типа Set в моем постоянном классе. Я сохраняю доступ к базе данных H2. Класс сохраняется корректно, и я могу просмотреть данные с помощью консоли H2 и увидеть, что атрибут Set сериализован для хранения, все в порядке, пока я не попытаюсь извлечь объект, мой атрибут всегда равен null. Я попытался добавить аннотации, чтобы остановить его сериализацию и добавить его в группу выборки по умолчанию, но безуспешно. Думаю, я действительно не понимаю, какие из них мне нужно добавить, чтобы остановить их сериализацию. На самом деле мне все равно, сериализуется ли он, если я могу восстановить набор и получить доступ к его членам.
Кто-нибудь может указать мне на простой пример сохранения набора с использованием 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. В этом примере выполняются запросы к одной строке, но в реальной жизни мне нужно будет выполнить это более чем к одной с помощью AND (amp;amp;) (ПРИМЕЧАНИЕ: Это хорошо работает на 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)
Ответ №1:
При использовании в среде GAE / J вам лучше пометить свой вопрос так. При использовании вне GAE / J у вас нет причин использовать такую древнюю неподдерживаемую версию DataNucleus, т. е. использовать v3.0
Если вы не хотите, чтобы набор был сериализован, тогда вам лучше всего было бы включить <join/> , поскольку в противном случае вы не разрешаете ему объединять таблицу, следовательно, он должен сериализовать ее
Комментарии:
1. Мой вопрос не о GAE / J — он работает там, используя какой-то код, скопированный у кого-то. Я хотел бы знать, как решить эту проблему для H2 и других СУБД в других средах. Вы говорите «вам было бы лучше всего включить, поскольку в противном случае вы не разрешаете ему таблицу объединения, следовательно, она должна сериализовать ее» , боюсь, я не понимаю, что это значит, вы имеете в виду включить какое-то соединение и заставить его создать таблицу объединения и поместить строки fts в таблицу объединения? Упростит ли это новая версия DN?
2. Редактор проглотил <join/amp; > в ответе, теперь исправлено. Где еще вы ожидаете, что набор будет сохранен, кроме как в таблице объединения? Все это соответствует спецификации JDO