我尝试了OrientDB Object Database API,它允许使用entityManager.registerEntityClasses(packagename)
将注册Java POJO用于数据库,然后用最少的额外努力读取它们。
但是,我想要实现的是在图表中将我的Java POJO注册为顶点。是否有一些映射可用于将Java POJO注册为顶点?
答案 0 :(得分:4)
抱歉,GraphAPI无法绑定到Object Database API。您可以使用TinkerPop Frames来实现此目的。
答案 1 :(得分:4)
由于TinkerPop Frame对我来说非常有限,因此每当从数据库中检索Vertex时,我都会通过制作Vertex to Object映射器来节省大量的样板代码。这样,我几乎感觉到我一直在使用对象而没有设置单独的属性等等。即使我主要使用图形api。
这段代码是一个基本的例子,并没有涵盖所有的情况,只有当你有一个带有setter的干净bean时,这些变量是基元或字符串。还要记住,这比直接调用要低,因为它使用反射。希望这对某人有用。我也使用此处的片段(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);
答案 2 :(得分:1)
注册课程后,您可以:
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