Java 一对多关系
我的问题是关于存储到数据库的一对多关系(as) 让我们假设一个例子:我们有父母和孩子。每个父记录可以有多个子记录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 =
// 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框架中被称为一级缓存。