我的问题是关于将一对多关系存储到数据库(如Programming a one-to-many relationship)
让我们假设一个例子:我们有父母和孩子。每条父记录都可以有很多孩子。
// Db storage:
// id name
public class Parent {
Set<Childs> mChilds;
private long mId;
private String mName;
// etc
public Parent(String name) {
this.mName = name;
}
public static Parent load(id) {
// query database for all Parent attributes
Parent p = new Parent("somename");
// now its time to load set of child (1)
Set<Child> children = Child.loadChildren(p);
}
}
// Db storage
// id name parent_ref
public class Child {
private Parent mParent;
private String mName;
public Child(String name, Parent parent) {
this.mName = name;
this.mParent = parent;
}
// loads a child with specific Id
public static Child load(long id) {
// query db like
Cursor c = db.query("child_table", new String[] {"id", "name", "parent_ref"}, "id = ?", new String[] {String.valueOf(id)});
// now we have a cursor, we can construct child!
// Oh my God! I call Parent.load, that calls loadChildren(3)
return new Child(c.getColumn("name"), Parent.load(c.getColumn("parent_ref")));
}
public static Set<Child> loadChildren(Parent parent){
// fetch all child ids, that given parent has
List<long> childIds = getAllIds(parent);
// for each id load child (2)
Child c = Child.load(childId);
}
}
如您所见,我想按给定ID加载父级。 Parent的load函数调用child的loadlChildren(调用(1)),调用Child.load(调用(2)),调用Parent.load( 3 < / strong>)因为它需要引用父项!
所以有两个主要问题,我是java dev的新手。
1)有关此问题的解决方法吗?我做错了什么? 2)我对loadChildren的调用将创建n个Parent(n个引用n个对象),而不是创建对一个对象的引用。我该怎么办?
答案 0 :(得分:0)
为什么不实现某种缓存系统(可能带有Java HashMap),您可以在其中放置父级及其子级而不是加载它们,只有在它们尚未加载时才加载它们缓存?如果它们在缓存中是alredy,请获取对它们的引用。
我还要看一下:Flyweight pattern
或者我能想到的另一个解决方案是在Parent类中实现另一个方法:somethink like“loadOnlyParent()”,它只加载没有子节点的Parent(如果尚未加载)。并且仅在必要时实现lazy loading个子项(如果尚未加载)。