Постоянные интерфейсы, использующие JDO / Datanucleus - PullRequest
1 голос
/ 03 октября 2011

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

@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) -Class com.skycomm.cth.beans.ixload.radius.TestData, указанный для использования "идентификатора приложения", но не был указан "objectid-class". Возврат к javax.jdo.identity.StringIdentity

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

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

1 Ответ

0 голосов
/ 15 мая 2012

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

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

@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 {

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

...