簡體   English   中英

我可以將我的Java類注冊為OrientDB Vertices和/或Edges嗎?

[英]Can I register my Java classes as OrientDB Vertices and/or Edges?

我嘗試了OrientDB 對象數據庫API ,它允許使用entityManager.registerEntityClasses(packagename)將注冊Java POJO用於​​數據庫,然后用最少的額外工作讀取它們。

但是,我想要實現的是在圖表中將我的Java POJO注冊為頂點。 是否有一些映射可用於將Java POJO注冊為頂點?

抱歉,GraphAPI無法綁定到Object Database API。 您可以使用TinkerPop框架來實現此目的。

由於TinkerPop Frame對我來說非常有限,因此每當從數據庫中檢索Vertex時,我都會通過制作Vertex to Object映射器來節省大量的樣板代碼。 這樣,我幾乎感覺到我一直在使用對象而沒有設置個別屬性等等。即使我主要使用圖形api。

這段代碼是一個基本的例子,並沒有涵蓋所有的情況,只有當你有一個干凈的bean上有這些變量的基礎或字符串的setter時。 還要記住,這比直接調用要低,因為它使用反射。 希望這對某人有用。 我也在這里使用一個片段( https://stackoverflow.com/a/1042827/986160 )來獲取所有繼承的字段。

public class ObjectMapper<T> {  

    public static List<Field> getAllFields(List<Field> fields, Class<?> type)       {
         fields.addAll(Arrays.asList(type.getDeclaredFields()));

         if (type.getSuperclass() != null) {
             fields = getAllFields(fields, type.getSuperclass());
         }

         return fields;
    }

    public Vertex mapObjToVertex(T obj, Vertex v){
        if (obj == null ) { return null; }

        for (Field field : getAllFields(new LinkedList<Field>(), obj.getClass())) {
            field.setAccessible(true);

            String name = field.getName();
            String type = field.getType().getSimpleName();
            boolean isPrimitive = field.getType().isPrimitive();
            if(isPrimitive || type.equals("String")){
                try {
                    Object value = field.get(obj);
                    if(value!=null){
                        v.setProperty(name,value);
                    }
                } catch (IllegalArgumentException | IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
        return v;
    }


    public T mapVertexToObj(Vertex v, T obj) {
        if (v == null) { return null; }

        for (Field field : getAllFields(new LinkedList<Field>(), obj.getClass())) {
            field.setAccessible(true);

            String name = field.getName();
            String type = field.getType().getSimpleName();
            boolean isPrimitive = field.getType().isPrimitive();


            if(!isPrimitive && !type.equals("String")) continue;

            Method setter;
            try {
                setter = new PropertyDescriptor(name, obj.getClass()).getWriteMethod();

            }
            catch(IntrospectionException ie) { continue; }

            try {
                if(name.equals("id")){
                    setter.invoke(obj, v.getId().toString());
                }
                else {
                    Object storedValue = v.getProperty(name);
                    if (storedValue !=null){
                        if(type.equals("String")) setter.invoke(obj, storedValue.toString());
                        else if(type.equals("byte")) setter.invoke(obj, (byte)storedValue);
                        else if(type.equals("int")) setter.invoke(obj, (int)storedValue);
                        else if(type.equals("float")) setter.invoke(obj, (float)storedValue);
                        else if(type.equals("long")) setter.invoke(obj, (long)storedValue);
                        else if(type.equals("double")) setter.invoke(obj, (double)storedValue);
                        else if(type.equals("boolean")) setter.invoke(obj,(boolean)storedValue);
                    }
                }

            }
            catch(Exception e){
                e.printStackTrace();
            }

        }
        return obj;
    }
}

它是這樣使用的:

Entity entity = new ObjectMapper<Entity>().mapVertexToObj(v,new Entity());

要么

Vertex v = new ObjectMapper<Entity>().mapObjToVertex(entity,v);

注冊課程后,您可以:

OSchema schema = db.getMetadata().getSchema();
schema.getClass("SomeVertexClass").setSuperClass(schema.getClass("V"));
schema.getClass("SomeEdgeClass").setSuperClass(schema.getClass("E"));

但是,要使用OObjectDatabaseTx連接刪除頂點或邊,您不能簡單地調用:

db.delete(somePojo);

相反,你需要做類似的事情

db.command(new OSQLSynchQuery("delete vertex/edge " + somePojo.getId())).execute();

對於為您執行此操作和級聯關系的庫,請參閱: ObjectGraphDb

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM