【问题标题】:Persisting interfaces using JDO/Datanucleus使用 JDO/Datanucleus 持久化接口
【发布时间】:2011-10-03 13:50:42
【问题描述】:

我有以下课程:

@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) -在 PC 字段“com.skycomm.cth.beans.TclRequest.testData”上执行可达性 - 在“com.skycomm.cth.beans.TclRequest.testData”字段中找不到 PC 对象“”的 StateManager - 忽略可达性

这意味着什么? 提前致谢。

【问题讨论】:

    标签: jdo datanucleus


    【解决方案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 {
    

    所以这里很正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多