具有关系的对象形成(JDBC)

时间:2014-08-09 00:05:57

标签: java sql jdbc dao

有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);
                .........

2 个答案:

答案 0 :(得分:2)

将对象映射到关系并不像看起来那么容易。他们几十年来一直在研究它,仅在一些场景中取得了不错的成果。好消息是,有效的方案可以容纳大多数程序。

我建议你采取不同的方法,但首先我会给你一个例子,帮助你理解为什么我建议采用不同的方法。

想象一个想要查找所有部门的人,这需要查找所有员工(因为他们是部门对象的一部分)。这将要求每个员工都需要查找一个部门列表,这需要这些部门需要一份员工清单,这将...... [/ p>

也许现在你明白了。

在查找部门时,许多像你这样结构化的系统实际上不会返回完整Employees。他们返回&#34;员工标识符&#34;。这允许人们查找所有Departments,但它保证不会返回Employees,从而防止无限循环。然后,如果一个人有足够的兴趣,他们可以使用员工标识符查找单个员工,这当然包含部门标识符。

简而言之,我建议您不要在此级别重建关联。我建议您构建对象网格的断开连接的图形,以便以后可以轻松导航断开连接的图形。然后,如果你真的必须连接它们,你至少会在开始编织引用之前加载所有数据而不递归。

答案 1 :(得分:0)

许多ORM库使您能够如您所述定义一对多关系。 Sormula可以做到这一点。见one to many example

我喜欢Sormula的是,如果你在&#34;许多方面命名外键字段&#34;与字段#34;一边相同,然后Sormula将演绎关系,不需要注释。