我正在为Java中的ODM设计架构。我有一个带有顶级抽象Document
类的层级结构。 DB对象的实现将扩展此类。
public abstract class Document {
ObjectId id;
String db;
String collection;
}
public class Student extends Document {
db = "School";
collection = "Student";
String name;
int age;
float gpa;
}
我希望每个类能够静态获取其关联集合的结果。例如,我想做Students.get(Students.class, new ObjectId(12345))
这样会从数据库中返回Student
的内容。请注意,我需要在get()
方法中指定类,这是我正在使用的对象映射器库的限制(Morphia)。
强制每个类使用此get()
方法的最佳方法是什么?有几个限制因素:
get()
应该作为静态方法实现get()
的每个实现指定类。例如,如果我有Student
和Teacher
类,我想避免手动指定Students.class
和Teacher.class
。我不确定这是否可行,因为get()
是一种静态方法。我认为这是常见的抽象静态 Java问题的变体,但我想确保我先以正确的方式接近它。
答案 0 :(得分:1)
我认为你的学生班应该是这样的:
@Entity(name="Student")
public class Student extends Document {
protected String name;
protected int age;
protected float gpa;
...
}
通用查询会是这样的:
public <E extends BaseEntity> E get(Class<E> clazz, final ObjectId id) {
return mongoDatastore.find(clazz).field("id").equal(id).get();
}
为什么要让这个静态?你需要硬编码依赖关系并破坏多态性;使得无法使用模拟实现进行测试(不需要真正的数据库)。