有3个实体(与表匹配):
public class Enterprise{
private long id;
private String name;
private List<Department> departments;
//getters()/setters()
}
public class Department{
private long id;
private String name;
private List<Employee> employees;
//getters()/setters()
}
public class Employee{
private long id;
private String name;
private List<Department> departments;
//getters()/setters()
}
ENTERPRISE --- | 一对多 | --- --- DEPARTMENT | 多对多 | --- EMPLOYEE
有人可以在JDBC上编写方法:
List<Enterprise> findAll();
可以忽略连接,语句,查询等。主要困难是在正确的对象上设置所有引用(例如,以避免: enterprise.getDepartments()。get(1).getEmployees()。get(1).getDepartments()== NULL )。
示例(方法的开头):
List<Enterprise> findAll(){
ResultSet rs = executeQuery(SELECT_ALL_ENTERPRISES);
List<Enterprise> ents = createEnterprises(rs);
.........
答案 0 :(得分:2)
将对象映射到关系并不像看起来那么容易。他们几十年来一直在研究它,仅在一些场景中取得了不错的成果。好消息是,有效的方案可以容纳大多数程序。
我建议你采取不同的方法,但首先我会给你一个例子,帮助你理解为什么我建议采用不同的方法。
想象一个想要查找所有部门的人,这需要查找所有员工(因为他们是部门对象的一部分)。这将要求每个员工都需要查找一个部门列表,这需要这些部门需要一份员工清单,这将...... [/ p>
也许现在你明白了。
在查找部门时,许多像你这样结构化的系统实际上不会返回完整Employees
。他们返回&#34;员工标识符&#34;。这允许人们查找所有Departments,但它保证不会返回Employees,从而防止无限循环。然后,如果一个人有足够的兴趣,他们可以使用员工标识符查找单个员工,这当然包含部门标识符。
简而言之,我建议您不要在此级别重建关联。我建议您构建对象网格的断开连接的图形,以便以后可以轻松导航断开连接的图形。然后,如果你真的必须连接它们,你至少会在开始编织引用之前加载所有数据而不递归。
答案 1 :(得分:0)
许多ORM库使您能够如您所述定义一对多关系。 Sormula可以做到这一点。见one to many example。
我喜欢Sormula的是,如果你在&#34;许多方面命名外键字段&#34;与字段#34;一边相同,然后Sormula将演绎关系,不需要注释。