1

基本的にキーと値のペアである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データベースを使用してアプリケーションをテストしたところ、問題はありませんでした。

提案ありがとうございます!

4

1 に答える 1

3

主キーの定義を次のように変更するだけです。

@PrimaryKey
@Persistent
private Integer id;

に:

@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long id;

動作します。

于 2012-06-15T13:59:06.480 に答える