我可以将我的Java类注册为OrientDB Vertices和/或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时。 还要记住,这比直接调用要低,因为它使用reflection。 希望这对某人有用。 我也使用此处的代码段( https://stackoverflow.com/a/1042827/986160 )来获取所有inheritance的字段。

 public class ObjectMapper { public static List getAllFields(List 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(), 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(), 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().mapVertexToObj(v,new Entity()); 

要么

 Vertex v = new ObjectMapper().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