0

次のようなドメイン オブジェクトがあります。

@PersistenceCapable(detachable="true")
public class UserData implements java.io.Serializable
{
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long id;

    @Persistent
    @NotNull
    private String openId;

    public UserData(String openId)
    {
        this.openId = openId;
    }
}

次に、UserData オブジェクトを作成し、JDO を使用して永続化します。

UserData userData = ThreadLocalPMF.getPersistenceManager().makePersistent(new UserData(openId));

コードの少し後で、同じ PersistenceManager と同じスレッドを使用して、まだ開いている同じトランザクションでクエリを実行します。

Query query = ThreadLocalPMF.getPersistenceManager().newQuery(UserData.class, "openId == :openId");
query.setUnique(true);
UserData userData = (UserData)query.execute(openId);

ここで、以前に数行のコードで永続化されたオブジェクトの代わりに、クエリが null を返すことが一度発生しました。ここで何が問題なのですか?これは一貫性の問題ですか?アプリは高レプリケーション データストアを使用しています。

<property name="datanucleus.appengine.datastoreEnableXGTransactions" value="true"/>
4

2 に答える 2

0

GAE トランザクションでは、トランザクション内のすべてのクエリで、トランザクション開始時のデータストアの状態のスナップショットが表示されます。クエリは、トランザクション内で変更された新しいエンティティまたは更新されたエンティティを返しません。それを自分で追跡する必要があります。

詳細については、トランザクション クエリのドキュメントに戻る必要があります。

于 2013-03-21T18:37:10.507 に答える
0

でマークされた id 変数を持つオブジェクトを永続化する場合:

@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)

現時点では、提供された ID でオブジェクトが保存されるかどうかは 100% わかりません。しかし、オブジェクトはvalueStrategy.

これを修正するには、オブジェクトを保存した後、メソッドから戻る前にその ID を取得し、ID を保持して後でオブジェクトを検索します。

于 2013-03-21T00:45:59.153 に答える