2016-08-10 10 views
0

マップフィールドを持つ単純なPOJOを保存しようとすると、次の例外が発生します。スレッド "メイン" とjava.lang.ClassCastExceptionでjava.lang.Stringをcom.orientechnologies.orient.core.db.record.OIdentifiableにキャストできません

例外: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) 

 

任意の指導をいただければ幸いです!

+1

完全なスタックトレースを? –

+1

あなたのJavaバージョンは<5ですか?あなたは本当にあなたの 'Map'でジェネリックスを使うべきです。 – 4castle

+1

また、例外をスローしている行を指定する必要があります。 – azurefrog

答えて

1

に役立ちます願っています。私は、OType.EMBEDDEDMAPとしてEntity.mapフィールドを明示的に宣言することによって、自分のコードを動作させることができます。以下を参照してください:

 ... 
     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

だから、それは人々だ...

2

私はこのコードを使用しているし、それが

enter image description here

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(); 
    } 

} 

に動作しますが、それはいくつかの私は自分の質問に答えるつもりだ周り掘った後

関連する問題