OrientDB 对象中的 Joda DateTime API
Joda DateTime in OrientDB Object API
我正在使用 JDK 8、JodaTime 2.9.9 和 OrientDB 版本 2.2.26。
有没有办法将 DateTime 对象与 OrientDB 对象一起使用 API?
示例class:
class Entity {
private DateTime date;
public Entity(DateTime date){
this.date = date
}
public DateTime getDate(){
return date;
}
public void setDate(DateTime newDate){
this.date = newDate;
}
}
正在 OrientDB 中注册:
database.getEntityManager().registerEntityClass(Entity)
如果我尝试保存它:
database.save(new Entity(DateTime.now()))
然后我得到:
com.orientechnologies.orient.core.exception.OSerializationException:
Linked type [class org.joda.time.DateTime:2017–09–12T11:50:25.709–03:00]
cannot be serialized because is not part of registered entities.
如果我尝试注册 DateTime:
database.getEntityManager().registerEntityClass(DateTime)
然后我再次尝试保存实体:
database.save(new Entity(DateTime.now()))
因为它是final class,javassist 不能代理它,所以我得到了一个:
java.lang.RuntimeException: org.joda.time.DateTime is final
我不想将我的 class 更改为存储 long 而不是 DateTime。有没有办法为 DateTime 或类似地不会干扰我的实体的东西实现和注册某种序列化器和反序列化器?
好的,我知道怎么做了(Groovy中的代码):
def orientDbServer = OServerMain.create()
System.setProperty("ORIENTDB_HOME", new File("").getAbsolutePath());
orientDbServer.startup(new OServerConfiguration().with { cfg ->
location = "memory"
network = new OServerNetworkConfiguration(this)
users = [new OServerUserConfiguration(name: "root",
password: "root",
resources: "*")] as OServerUserConfiguration[]
cfg
})
orientDbServer.activate()
addShutdownHook {
orientDbServer.shutdown()
}
new OServerAdmin("localhost").connect("root", "root")
.createDatabase("test", "document", "memory").close()
OObjectDatabaseTx database =
new OObjectDatabaseTx("memory:localhost/test").open("admin", "admin")
OObjectSerializerContext serializerContext = new OObjectSerializerContext();
serializerContext.bind(new OObjectSerializer<DateTime, Long>() {
@Override
Object serializeFieldValue(Class<?> iClass, DateTime iFieldValue) {
return iFieldValue.getMillis()
}
@Override
Object unserializeFieldValue(Class<?> iClass, Long iFieldValue) {
return new DateTime(iFieldValue)
}
}, database)
OObjectSerializerHelper.bindSerializerContext(null, serializerContext)
重要的是在任何实体class注册之前注册序列化器上下文
我正在使用 JDK 8、JodaTime 2.9.9 和 OrientDB 版本 2.2.26。
有没有办法将 DateTime 对象与 OrientDB 对象一起使用 API?
示例class:
class Entity {
private DateTime date;
public Entity(DateTime date){
this.date = date
}
public DateTime getDate(){
return date;
}
public void setDate(DateTime newDate){
this.date = newDate;
}
}
正在 OrientDB 中注册:
database.getEntityManager().registerEntityClass(Entity)
如果我尝试保存它:
database.save(new Entity(DateTime.now()))
然后我得到:
com.orientechnologies.orient.core.exception.OSerializationException:
Linked type [class org.joda.time.DateTime:2017–09–12T11:50:25.709–03:00]
cannot be serialized because is not part of registered entities.
如果我尝试注册 DateTime:
database.getEntityManager().registerEntityClass(DateTime)
然后我再次尝试保存实体:
database.save(new Entity(DateTime.now()))
因为它是final class,javassist 不能代理它,所以我得到了一个:
java.lang.RuntimeException: org.joda.time.DateTime is final
我不想将我的 class 更改为存储 long 而不是 DateTime。有没有办法为 DateTime 或类似地不会干扰我的实体的东西实现和注册某种序列化器和反序列化器?
好的,我知道怎么做了(Groovy中的代码):
def orientDbServer = OServerMain.create()
System.setProperty("ORIENTDB_HOME", new File("").getAbsolutePath());
orientDbServer.startup(new OServerConfiguration().with { cfg ->
location = "memory"
network = new OServerNetworkConfiguration(this)
users = [new OServerUserConfiguration(name: "root",
password: "root",
resources: "*")] as OServerUserConfiguration[]
cfg
})
orientDbServer.activate()
addShutdownHook {
orientDbServer.shutdown()
}
new OServerAdmin("localhost").connect("root", "root")
.createDatabase("test", "document", "memory").close()
OObjectDatabaseTx database =
new OObjectDatabaseTx("memory:localhost/test").open("admin", "admin")
OObjectSerializerContext serializerContext = new OObjectSerializerContext();
serializerContext.bind(new OObjectSerializer<DateTime, Long>() {
@Override
Object serializeFieldValue(Class<?> iClass, DateTime iFieldValue) {
return iFieldValue.getMillis()
}
@Override
Object unserializeFieldValue(Class<?> iClass, Long iFieldValue) {
return new DateTime(iFieldValue)
}
}, database)
OObjectSerializerHelper.bindSerializerContext(null, serializerContext)
重要的是在任何实体class注册之前注册序列化器上下文