尝试使用地图字段保存简单的POJO时,我收到以下异常。
线程中的异常" main" java.lang.ClassCastException:java.lang.String无法强制转换为com.orientechnologies.orient.core.db.record.OIdentifiable
这是我的代码:
package com.example.test;
import com.orientechnologies.orient.client.remote.OServerAdmin;
import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx;
import com.orientechnologies.orient.object.db.OObjectDatabaseTx;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class Main {
static class Entity {
private Map map;
public Entity() {
}
public Entity(Map map) {
this.map = map;
}
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
}
private static void doIt() {
String dbUser = "root";
String dbPass = "root";
String dbUrl = "remote:localhost:2424/sandbox";
try {
OServerAdmin serverAdmin = new OServerAdmin(dbUrl);
serverAdmin.connect(dbUser, dbPass);
if (serverAdmin.existsDatabase("plocal")) {
serverAdmin.dropDatabase("plocal");
}
serverAdmin.createDatabase("document", "plocal");
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
ODatabaseDocumentTx databaseDocumentTx = new ODatabaseDocumentTx(dbUrl);
databaseDocumentTx.open(dbUser, dbPass);
OObjectDatabaseTx objectDatabaseTx = new OObjectDatabaseTx(databaseDocumentTx);
objectDatabaseTx.getEntityManager().registerEntityClass(Entity.class);
Map map = new HashMap();
map.put("a", "a");
Entity entity = objectDatabaseTx.save(new Entity(map)); //<-- EXCEPTION THROWN HERE!!!
}
public static void main(String[] args) {
doIt();
}
}
完整堆栈跟踪:
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to com.orientechnologies.orient.core.db.record.OIdentifiable
at com.orientechnologies.orient.core.db.record.ORecordLazyMap.put(ORecordLazyMap.java:41)
at com.orientechnologies.orient.object.enhancement.OObjectEntitySerializer.multiValueToStream(OObjectEntitySerializer.java:1398)
at com.orientechnologies.orient.object.enhancement.OObjectEntitySerializer.typeToStream(OObjectEntitySerializer.java:805)
at com.orientechnologies.orient.object.enhancement.OObjectEntitySerializer.toStream(OObjectEntitySerializer.java:1216)
at com.orientechnologies.orient.object.enhancement.OObjectEntitySerializer.serializeObject(OObjectEntitySerializer.java:144)
at com.orientechnologies.orient.object.db.OObjectDatabaseTx.save(OObjectDatabaseTx.java:454)
at com.orientechnologies.orient.object.db.OObjectDatabaseTx.save(OObjectDatabaseTx.java:399)
at com.example.test.Main.doIt(Main.java:56)
at com.example.test.Main.main(Main.java:60)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
任何有关正在发生的事情的指导都将非常感激!
答案 0 :(得分:2)
我已经使用过此代码并且可以正常使用
import com.orientechnologies.orient.client.remote.OServerAdmin;
import com.orientechnologies.orient.object.db.OObjectDatabaseTx;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class Main {
static class Entity {
private Map<String,Object> map;
public Entity() {
this.map=null;
}
public Entity(Map<String,Object> map) {
this.map = map;
}
public Map<String,Object> getMap() {
return map;
}
public void setMap(Map<String,Object> map) {
this.map = map;
}
}
private static void doIt() {
String dbUser = "root";
String dbPass = "root";
String dbUrl = "remote:localhost:2424/sandbox";
try {
OServerAdmin serverAdmin = new OServerAdmin(dbUrl);
serverAdmin.connect(dbUser, dbPass);
if (serverAdmin.existsDatabase("plocal")) {
serverAdmin.dropDatabase("plocal");
System.out.println("Db cancellalto");
}
//serverAdmin.createDatabase("document", "plocal");
serverAdmin.createDatabase("sandbox", "object", "plocal");
System.out.println("Db creato");
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
OObjectDatabaseTx objectDatabaseTx = new OObjectDatabaseTx(dbUrl);
objectDatabaseTx.open(dbUser,dbPass);
objectDatabaseTx.getEntityManager().registerEntityClass(Entity.class);
Entity e = objectDatabaseTx.newInstance(Entity.class);
Map<String, Object> map = new HashMap<String, Object>();
map.put("a", "a");
e.setMap(map);
// Save the entity
e = objectDatabaseTx.save(e);
}
public static void main(String[] args) {
doIt();
}
}
希望有所帮助
答案 1 :(得分:1)
经过一番挖掘,我将回答我自己的问题。我可以通过将Entity.map字段明确声明为OType.EMBEDDEDMAP来使我的代码工作。见下文:
...
objectDatabaseTx.getEntityManager().registerEntityClass(Entity.class);
OClass oClass = objectDatabaseTx.getMetadata().getSchema().getClass(Entity.class);
oClass.createProperty("map", OType.EMBEDDEDMAP);
...
但是,我最终需要我的地图包含任何值(即:Map<String, Object>
)。但我不能,因为那是一个开放的错误......
https://github.com/orientechnologies/orientdb/issues/3063
这就是人们......