一对多关系

时间:2012-11-25 10:39:09

标签: java one-to-many

我的问题是关于将一​​对多关系存储到数据库(如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个对象),而不是创建对一个对象的引用。我该怎么办?

1 个答案:

答案 0 :(得分:0)

为什么不实现某种缓存系统(可能带有Java HashMap),您可以在其中放置父级及其子级而不是加载它们,只有在它们尚未加载时才加载它们缓存?如果它们在缓存中是alredy,请获取对它们的引用。

我还要看一下:Flyweight pattern

或者我能想到的另一个解决方案是在Parent类中实现另一个方法:somethink like“loadOnlyParent()”,它只加载没有子节点的Parent(如果尚未加载)。并且仅在必要时实现lazy loading个子项(如果尚未加载)。