Сохранение интерфейсов с использованием JDO / Datanucleus

У меня следующий класс:

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true")
public class TclRequest implements Comparable<TclRequest> {
    @PrimaryKey
    private String id;

    @Persistent(types = { DNSTestData.class, POP3TestData.class, PPPoETestData.class, RADIUSTestData.class }, defaultFetchGroup = "true")
    @Columns({ @Column(name = "dnstestdata_fk"), @Column(name = "pop3testdata_fk"), @Column(name = "pppoetestdata_fk"), @Column(name = "radiustestdata_fk") })
    private TestData testData;

    public String getId() {
        return id;
    }

    public TestData getTestData() {
        return testData;
    }

    public void setId(String id) {
        this.id = id;
    }

    public void setTestData(TestData testData) {
        this.testData = testData;
    }
}

Интерфейс TestData выглядит так:

@PersistenceCapable(detachable = "true")
    public interface TestData {
    @PrimaryKey
    public String getId();

    public void setId(String id);
}

Что реализовано многими классами, включая этот:

@PersistenceCapable(detachable = "true")
public class RADIUSTestData implements TestData {
    @PrimaryKey
    private String id;
    private String password;
    private String username;

    public RADIUSTestData() {
    }

    public RADIUSTestData(String password, String username) {
        super();
        this.password = password;
        this.username = username;
    }

    @Override
    public String getId() {
        return id;
    }

    @Override
    public void setId(String id) {
        this.id = id;
    }
}

Когда я пытаюсь сохранить класс TclRequest, конечно, после его создания и использования RADIUSTestData:

//'o' is the constructed TclRequest object.
PersistenceManager pm = null;
Transaction t = null;
try {
    pm = getPM();
    t = pm.currentTransaction();
    t.begin();
    pm.makePersistent(o);
    t.commit();
} catch (Exception e) {
    e.printStackTrace();
    if (t != null && t.isActive()) {
        t.rollback();
    }
} finally {
    closePM(pm);
}

Поле интерфейса не сохраняется. И столбец в таблице не создается! Я включил режим отладки и обнаружил 2 уловки:

1) -Класс com.skycomm.cth.beans.ixload.radius.TestData указан для использования «идентификатора приложения», но не указан «класс-объект». Возврат к javax.jdo.identity.StringIdentity

2) -Выполнение достижимости в поле ПК "com.skycomm.cth.beans.TclRequest.testData" -Не удалось найти StateManager для объекта ПК "" в поле "com.skycomm.cth.beans.TclRequest.testData" - игнорирование для доступности

Что это могло значить? Заранее спасибо.


person Muhammad Gelbana    schedule 03.10.2011    source источник


Ответы (1)


Я понял, как это сделать. Он не очень масштабируемый, но пока работает.

Это аннотации для переменной-члена интерфейса. Обратите внимание, что порядок объявленных типов, столбцов и имен классов в значении расширения важно поддерживать:

@Persistent(types = { RADIUSTestData.class, POP3TestData.class, PPPoETestData.class, DNSTestData.class }, defaultFetchGroup = "true")
@Columns({ @Column(name = "radiustestdata_fk"), @Column(name = "pop3testdata_fk"), @Column(name = "pppoetestdata_fk"),
@Column(name = "dnstestdata_fk") })
@Extension(vendorName = "datanucleus", key = "implementation-classes", value = "com.skycomm.cth.tcl.beans.radius.RADIUSTestData, com.skycomm.cth.tcl.beans.pop3.POP3TestData, com.skycomm.cth.tcl.beans.pppoe.PPPoETestData, com.skycomm.cth.tcl.beans.dns.DNSTestData")

Пример класса, реализующего один из интерфейсов (просто «заголовок»):

@PersistenceCapable(detachable = "true")
public class RADIUSTestData implements TestData {

Так что здесь вполне нормально.

person Muhammad Gelbana    schedule 15.05.2012