我与两个数据存储接口,其中一个是 RDMS,另一个是 LDAP。我想要做的是使用 RDBMS 中的“超类表”和 LDAP 中的“完整表”来保持层次结构。
这样的事情可能吗?也就是说,您可以为 *.orm 文件中的每个数据存储分别指定多个继承策略,还是我被迫使用单一继承策略?
我在 DataNucleus 的文档中找不到此信息,我唯一确定的是您可以将继承元素放在 .orm 文件而不是 .jdo 文件中,但这仍然不能回答我的问题......
层次结构相当简单,由一个抽象类和几个子类组成,如下所示:
abstract class Foo implements IFoo
{
...
}
class Foo1 extends Foo
{
...
}
class Foo2 extends Foo
{
...
}
...
我试图在两个 *.orm 文件和 .jdo 文件中配置继承(记住它会被前者覆盖)但我得到一个异常
Caused by: org.datanucleus.metadata.InvalidMetaDataException: Class "...Foo1..." has been specified with an inheritance strategy of "superclass-table", yet no superclass exists or none exists with its own table!
at org.datanucleus.metadata.AbstractClassMetaData.validateUserInputForInheritanceMetaData(AbstractClassMetaData.java:903)
at org.datanucleus.metadata.ClassMetaData.populate(ClassMetaData.java:214)
at org.datanucleus.metadata.MetaDataManager$1.run(MetaDataManager.java:2393)
at java.security.AccessController.doPrivileged(Native Method)
at org.datanucleus.metadata.MetaDataManager.populateAbstractClassMetaData(MetaDataManager.java:2387)
at org.datanucleus.metadata.MetaDataManager.populateFileMetaData(MetaDataManager.java:2224)
at org.datanucleus.jdo.metadata.JDOMetaDataManager.loadMetaDataForClass(JDOMetaDataManager.java:741)
at org.datanucleus.jdo.metadata.JDOMetaDataManager.getMetaDataForClassInternal(JDOMetaDataManager.java:353)
at org.datanucleus.jdo.metadata.JDOMetaDataManager$MetaDataRegisterClassListener.registerClass(JDOMetaDataManager.java:184)
at javax.jdo.spi.JDOImplHelper.registerClass(JDOImplHelper.java:376)
然后我尝试从 .jdo 中删除继承元素,但增强器失败并显示以下消息:
Class "...Foo1..." has been specified to use an inheritance strategy of "superclass-table", persisting to the table of class ...Foo..., however this class doesnt have a discriminator specified.
各个配置是正确的(对于第一种情况,新表在基类中具有鉴别器,在子类中具有超类表,在第二种情况下仅在基类中具有完整表)。