我与两个数据存储接口,其中一个是RDMS,另一个是LDAP。我想要做的是使用RDBMS中的“superclass-table”和LDAP中的“complete-table”来持久化层次结构。
这样的事情可能吗?也就是说,你可以为* .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.
各个配置是正确的(new-table在基类具有鉴别符,在第二种情况下具有子类的超类表,而在第二种情况下仅在基类处具有完整表)。
答案 0 :(得分:0)
您可以将该信息放在orm文件中,是的,确实可以回答您的问题,因为您有一个用于RDBMS的ORM文件和一个用于LDAP的ORM文件。所以package-rdbms.orm和package-ldap.orm,然后简单地将持久性属性“javax.jdo.option.Mapping”设置为“rdbms”或“ldap”。简单