Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一对多关系_Java_One To Many - Fatal编程技术网

Java 一对多关系

Java 一对多关系,java,one-to-many,Java,One To Many,我的问题是关于存储到数据库的一对多关系(as) 让我们假设一个例子:我们有父母和孩子。每个父记录可以有多个子记录 // Db storage: // id name public class Parent { Set<Childs> mChilds; private long mId; private String mName; // etc public Parent(String name) { this.mName =

我的问题是关于存储到数据库的一对多关系(as)

让我们假设一个例子:我们有父母和孩子。每个父记录可以有多个子记录

// 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);
    }
}
//数据库存储:
//身份证名称
公共类父类{
设置mChilds;
私人长中;
私有字符串mName;
//等
公共父级(字符串名称){
this.mName=名称;
}
公共静态父加载(id){
//查询数据库中的所有父属性
父项p=新父项(“somename”);
//现在是加载子项集(1)的时候了
Set children=Child.loadChildren(p);
}
}
//数据库存储
//id名称父项\u ref
公营儿童{
私人租赁;
私有字符串mName;
公共子级(字符串名称、父级){
this.mName=名称;
this.mParent=parent;
}
//加载具有特定Id的子对象
公共静态子负载(长id){
//查询类数据库
游标c=db.query(“child_table”,新字符串[]{“id”,“name”,“parent_ref”},“id=?”,新字符串[]{String.valueOf(id)});
//现在我们有了一个游标,我们可以构造子对象了!
//天哪!我叫Parent.load,那叫loadChildren(3)
返回新的子级(c.getColumn(“name”)、父级.load(c.getColumn(“Parent_ref”));
}
公共静态集loadChildren(父-父){
//获取给定父项具有的所有子ID
List ChildId=GetAllId(父项);
//对于每个id加载子项(2)
Child c=Child.load(childId);
}
}
如您所见,我希望通过给定的Id加载parent。parent的load函数调用child的loadlChildren(call(1)),它调用child.load(call(2)),它调用parent.load(3),因为它需要引用parent

因此,对于java开发人员来说,我还不熟悉两个主要问题

1) 这个问题有什么解决办法吗?我做错了什么?
2) 我对loadChildren的调用将创建n个父对象(n个对n个对象的引用),而不是创建对一个对象的引用。我该怎么办?

为什么不实现某种缓存系统(可能带有),在其中可以放置父级及其子级,而不是加载它们,只在它们不在缓存中时加载它们?如果它们在缓存中已经存在,则获取对它们的引用

我还要看一下:


或者我可以想到的另一个解决方案是在父类中实现另一个方法:类似于“loadOnlyParent()”的方法,它只加载父类(如果尚未加载),而不加载子类。并且仅在必要时才实现子对象的一部分(如果尚未加载)

您应该避免创建自己的ORM解决方案,而是使用JPA,JPA可以做到这一点,但要以更好、更快和标准的方式。这只是为了培训。对于真正的应用程序,您需要跟踪已实例化的实体,例如,通过将它们存储在映射中(通过它们的主键进行索引)。+1到JB Nizet。当提供了兼容的、高效的工具时——我们应该尽可能地利用它们:)@user1284151:培训很好,但我仍然会培训自己使用JPA,而不是培训自己开发新的ORM框架+1致纪尧姆:这张地图在ORM框架中被称为一级缓存。