私は 2 つのデータ ストアとやり取りしています。そのうちの 1 つは RDMS で、もう 1 つは LDAP です。私がやりたいことは、RDBMS の「superclass-table」と LDAP の「complete-table」を使用して階層を永続化することです。
そのようなことは可能ですか?つまり、複数の継承戦略を *.orm ファイル内のデータ ストアごとに個別に指定できますか? それとも、単一の継承戦略を使用する必要がありますか?
DataNucleus のドキュメントでこの情報を見つけることができませんでした。私が確信しているのは、継承要素を .jdo の代わりに .orm ファイルに入れることができるということだけですが、それでも私の質問には答えません...
階層はかなり単純で、次のような抽象クラスといくつかのサブクラスで構成されています。
abstract class Foo implements IFoo
{
...
}
class Foo1 extends Foo
{
...
}
class Foo2 extends Foo
{
...
}
...
2 つの *.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.
個々の構成は正しいです (最初のケースでは base-class に識別子があり、superclass-table がサブクラスにあり、2 番目のケースでは base-class に完全なテーブルのみがあります)。