【问题标题】:Object formation with relationships(JDBC)具有关系的对象形成(JDBC)
【发布时间】:2014-08-09 00:05:56
【问题描述】:

有 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()
  }

企业---|OneToMany|---部门---|ManyToMany|---员工

谁能在 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);
                .........

【问题讨论】:

  • 您能否解释一下为什么要使用 JDBC 而不是 JPA?

标签: java sql jdbc dao


【解决方案1】:

将对象映射到关系并不像看起来那么容易。他们已经为此工作了几十年,仅在某些场景中取得了不错的结果。好消息是,适用的场景可以适应大多数程序。

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

想象一个人想要查找所有部门,这将需要查找所有员工(因为它们是部门对象的一部分)。这将要求对于每个员工,需要查找部门列表,这将要求这些部门需要员工列表,这将......

也许现在你明白了。

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

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

【讨论】:

    【解决方案2】:

    许多 ORM 库使您能够按照您的描述定义一对多关系。索穆拉可以做到这一点。见one to many example

    我喜欢Sormula的一点是,如果你将“多面”的外键字段命名为与“一面”字段相同,那么Sormula会推断出关系,不需要注释。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多