Datanucleus / JDO, сохраняющийся и извлекающий java.util.Установить атрибут

#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