基本的にキーと値のペアであるConfigurationPropertyクラスを定義しました(キーは厳密に正の整数で、値は文字列です)。
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
@PersistenceCapable(detachable = "true")
public final class ConfigurationProperty
{
@PrimaryKey
@Persistent
private Integer id;
@Persistent
private String value;
public ConfigurationProperty(Integer id, String value)
{
this.id = id;
this.setValue(value);
}
public Integer getId()
{
return this.id;
}
public String getValue()
{
return value;
}
public void setValue(String value)
{
this.value = value;
}
}
ご覧のとおり、フィールド「id」(キーと値のペアのキー)を定義し、それをクラスの主キーとして使用しています。
ただし、エントリにアクセスしようとすると、次のようになります。
int searchId = 4;
ConfigurationProperty property =
this.persistence.getObjectById(ConfigurationProperty.class, searchId);
例外が発生します:
javax.jdo.JDOFatalUserException: Received a request to find an object of type [mypackage].ConfigurationProperty identified by 4. This is not a valid representation of a primary key for an instance of [mypackage].ConfigurationProperty.
NestedThrowables:
org.datanucleus.exceptions.NucleusFatalUserException: Received a request to find an object of type [mypackage].ConfigurationProperty identified by 4. This is not a valid representation of a primary key for an instance of [mypackage].ConfigurationProperty.)
主キーとペアのキーに別々のフィールドを作成しても例外が発生しないことはほぼ確実ですが、ペアのキーは一意であるため、何らかの形の冗長性が発生し、パフォーマンスの問題が発生する可能性があります。
また、GoogleAppengineでのみ例外が発生します。Derbyデータベースを使用してアプリケーションをテストしたところ、問題はありませんでした。
提案ありがとうございます!