0

我与两个数据存储接口,其中一个是 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.

各个配置是正确的(对于第一种情况,新表在基类中具有鉴别器,在子类中具有超类表,在第二种情况下仅在基类中具有完整表)。

4

1 回答 1

0

您可以将该信息放在 orm 文件中,是的,这确实回答了您的问题,因为您有一个用于 RDBMS 的 ORM 文件和一个用于 LDAP 的 ORM 文件。所以 package-rdbms.orm 和 package-ldap.orm,然后简单地将持久性属性“javax.jdo.option.Mapping”设置为“rdbms”或“ldap”。简单的

于 2012-04-07T07:05:12.913 回答