1

クラスでUUIDフィールドを使用すると奇妙な問題が発生します。

オブジェクトをデータベースに永続化するためにNeoDatisを使用していますが、取得したインスタンスのフィールド値がオブジェクトを保存したときの値と等しくないことを除いて、これは正常に機能しています。

特に、leastSigBits と mostSigBits は、取得されたインスタンスと元のインスタンスで同じですが、「バリアント」フィールドが異なります。

Neodatis は一時的なものとしてマークされているため、Variant フィールドを保存しないと思いますが、奇妙なことに、このフィールドはvariant()関数によってのみ設定され、leastSigBits および mostSigBits フィールドの値のみに基づいて遅延計算されます。この 2 つのフィールドを同じ値にすると、バリアント フィールドでも同じ値が得られると予想されますが、代わりに、元のオブジェクトで 2 の値を取得し、保存および取得されたオブジェクトで 0 の値を取得します。

どちらのインスタンスも同じ文字列値に解決されるため、UUID の文字列表現を保存することで問題をスキップできますが、何が問題なのかを理解したいと思います。

編集:

問題を再現するテストクラスを作成しました:

public class TestObj {
    public UUID getId() {
        return id;
    }

    private final UUID id = UUID.randomUUID();

    @Test
    public static void storeAndRetrieve() {
        TestObj o = new TestObj();
        ODB odb = ODBFactory.open("tested.db");
        try {
            odb.store(o);
        } finally {
            odb.close();
        }

        odb = ODBFactory.open("tested.db");
        try {
            TestObj o2 = odb.<TestObj>getObjects(TestObj.class).getFirst();
            Assert.assertEquals(o2.getId().toString(), o.getId().toString());
            Assert.assertEquals(o2.getId(), o.getId());   /*this one fail!*/ 
        } finally {
            odb.close();
        }

    }
}
4

2 に答える 2

0

問題は、NeoDatis が一時フィールドを -1 ではなくゼロに初期化することです。

これらのフィールドには、次のデフォルト値が必要です: version = -1; バリアント = -1; タイムスタンプ = -1; シーケンス = -1; ノード = -1; hashCode = -1;

NeoDatis は実際には java.util.UUID をオブジェクトではなく値型として扱うべきです。

于 2013-01-22T18:51:27.443 に答える