我可以将Java类注册为OrientDB顶点和/或边吗?

我可以将Java类注册为OrientDB顶点和/或边吗?,java,orientdb,Java,Orientdb,我尝试了OrientDB,它允许使用entityManager.RegisterEntityClass(packagename)将Java POJO注册到数据库中,然后以最小的额外工作量读写它们 然而,我想要实现的是将我的Java POJO注册为图形中的顶点。是否有一些映射可用于将Java POJO注册为顶点?抱歉,GraphAPI无法绑定到对象数据库API。您可以为此目的使用。注册类后,您可以执行以下操作: OSchema schema = db.getMetadata().getSchema

我尝试了OrientDB,它允许使用entityManager.RegisterEntityClass(packagename)将Java POJO注册到数据库中,然后以最小的额外工作量读写它们


然而,我想要实现的是将我的Java POJO注册为图形中的顶点。是否有一些映射可用于将Java POJO注册为顶点?

抱歉,GraphAPI无法绑定到对象数据库API。您可以为此目的使用。

注册类后,您可以执行以下操作:

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

对于为您提供此功能和级联关系的库,请参见:

,因为TinkerPop Frame对我来说非常有限,所以每当从数据库检索顶点时,我都通过制作顶点到对象映射器来保存大量样板代码。这样一来,我几乎感觉到我一直在使用对象,而没有设置单独的属性等等,尽管我主要使用的是graph api

这段代码是一个基本的示例,它并没有涵盖所有的情况,只是当您有一个干净的bean,在这些变量上有setter,这些变量要么是原语,要么是字符串。还要记住,这比直接调用性能差,因为它使用反射。希望这将是有用的人。我还使用了一个来自here()的代码片段来获取所有继承的字段

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;
    }
}
公共类对象映射程序{
公共静态列表getAllFields(列表字段,类类型){
addAll(Arrays.asList(type.getDeclaredFields());
if(type.getSuperclass()!=null){
fields=getAllFields(字段,类型.getSuperclass());
}
返回字段;
}
公共顶点映射对象覆盖(T对象,顶点v){
如果(obj==null){返回null;}
for(字段:getAllFields(新LinkedList(),obj.getClass())){
字段。setAccessible(true);
字符串名称=field.getName();
字符串类型=field.getType().getSimpleName();
布尔isPrimitive=field.getType().isPrimitive();
if(isPrimitive | | type.equals(“字符串”)){
试一试{
对象值=field.get(obj);
if(值!=null){
v、 setProperty(名称、值);
}
}捕获(IllegalArgumentException | IllegalAccessException e){
e、 printStackTrace();
}
}
}
返回v;
}
公共T映射顶点对象(顶点v,T对象){
如果(v==null){返回null;}
for(字段:getAllFields(新LinkedList(),obj.getClass())){
字段。setAccessible(true);
字符串名称=field.getName();
字符串类型=field.getType().getSimpleName();
布尔isPrimitive=field.getType().isPrimitive();
如果(!isPrimitive&&!type.equals(“字符串”)继续;
方法制定者;
试一试{
setter=newPropertyDescriptor(名称,obj.getClass()).getWriteMethod();
}
catch(内省异常){continue;}
试一试{
如果(名称等于(“id”)){
invoke(obj,v.getId().toString());
}
否则{
Object storedValue=v.getProperty(名称);
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);
}
}
}
捕获(例外e){
e、 printStackTrace();
}
}
返回obj;
}
}
它是这样使用的:

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

Vertex v=new ObjectMapper().mapObjToVertex(实体,v);

Edit:Added map from Object to Graph VertexI我知道这个问题现在已经很老了,但是在()有一个beta稳定版本,可以满足您的需要。
Vertex v = new ObjectMapper<Entity>().mapObjToVertex(entity,v);