gpt4 book ai didi

java - NeoDatis 未存储 UUID 字段

转载 作者:太空宇宙 更新时间:2023-11-04 08:10:21 25 4
gpt4 key购买 nike

我在使用 UUID 时遇到了一个奇怪的问题类中的字段。

我正在使用NeoDatis将对象保存到数据库中,这工作正常,只是检索到的实例的字段值不等于我保存对象时的值。

特别是,在检索到的实例和原始实例中,leastSigBits 和mostSigBits 是相同的,但“variant”字段不同!

我假设 Neodatis 不存储变量字段,因为它被标记为 transient ,但奇怪的是该字段仅由 variant() 设置函数,它仅根据leastSigBits和mostSigBits字段的值来延迟计算它。让这两个字段具有相同的值,我希望变体字段也能获得相同的值,但我在原始对象中得到的值为 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();
}

}
}

最佳答案

我也遇到了同样的问题,但在与 Olivier(该项目的主要开发人员)讨论后,他给了我解决方案:使用 InstantiationHelper

他在源代码树中添加了一些测试。看org.neodatis.odb.test.uuid.TestUUID.java在 CVS 存储库中。就我而言,我使用了第二种解决方案:

public void testWithFullInstantiationHelper() throws Exception {
String baseName = getBaseName();
ODB odb = open(baseName);

ClassWithUUID o = new ClassWithUUID("t1", UUID.randomUUID());
odb.store(o);
odb.close();
odb = open(baseName);

// Sets the instantiation helper
ClassRepresentation uuidRepresentation = odb.getClassRepresentation(UUID.class);
uuidRepresentation.addFullInstantiationHelper(new FullInstantiationHelper() {
public Object instantiate(NonNativeObjectInfo nnoi) {
// retrieve uuid instance field values
AbstractObjectInfo[] aois = nnoi.getAttributeValues();
// build the instance from the internal values
return new UUID((Long) aois[0].getObject(), (Long) aois[1].getObject());
}
});

Objects<ClassWithUUID> objects = odb.getObjects(ClassWithUUID.class);
assertEquals(1, objects.size());
// check name and uuid
assertEquals(objects.getFirst().getName(), o.getName());
assertEquals(objects.getFirst().getUuid(), o.getUuid());
odb.close();
deleteBase(baseName);
}

关于java - NeoDatis 未存储 UUID 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11332943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com