Datanucleus / JDO, сохранение и получение атрибута java.util.Set - PullRequest
0 голосов
/ 11 июня 2011

У меня есть атрибут типа 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)

1 Ответ

0 голосов
/ 12 июня 2011

Если вы используете в среде GAE / J, то вам лучше всего так обозначить свой вопрос.Если вы используете за пределами GAE / J, то у вас нет причин использовать такую ​​древнюю неподдерживаемую версию DataNucleus, т.е. использовать v3.0

Если вы не хотите, чтобы набор был сериализованным, вам лучше всеговключатьпоскольку в противном случае вы не разрешаете ему объединение таблиц, следовательно, оно должно сериализовать его

...