我应该在哪个层中将2个实体连接在一起?

时间:2013-10-22 08:26:24

标签: java spring-mvc paradigms

我使用Spring MVC和常规JDBC。

我刚刚了解到我应该将业务流程分为层,这些层是表示层,控制器层,服务层和存储库/ DAO层。现在假设我有一个名为Person的实体,可以有多个JobsJob本身是另一个拥有自己属性的实体。根据我收集的内容,存储库层只管理一个实体。现在我有一个包含另一个实体的实体。我在哪里“加入”他们?服务层?

假设我想要person job尚未知道(延迟加载)。但是系统可能会询问该特定job的{​​{1}}后来会是什么。在这种情况下,每个层的作用是什么?

如果我需要在此问题中添加任何细节,请与我们联系。

3 个答案:

答案 0 :(得分:0)

在典型的OOP中,对象之间的关系是通过创建关联来实现的。如果JobPerson之间的关联是多对一的。然后,您应该向Person添加Job的属性。另一方面,PersonJob之间的关联是一对多,因此您可以向Job添加一组Person。如果您不想加载此人的所有关联作业,则可以将此关联映射为延迟加载。默认情况下,这在ORM和JPA中使用。

class Person {
 Set<Job> jobs;
}

class Job {
 Person person;
}

每个层用于分离和解耦用于处理相同或不同对象的逻辑。

另一方面,用于映射对象模型的对象在每个图层上可能不同,您需要在需要更新模型时转换数据。它取决于用于持久层的持久性框架的实现。拥有服务层,您可以从持久层实现中进行抽象,如果您最近更改了持久性框架,则封装在服务层中的业务逻辑不会更改。表示层还可以包含自己的对象,称为用于处理表示层的不同方面的视图对象。创建,操作和呈现这些对象的逻辑属于表示层,该表示层显然由表示框架实现。

答案 1 :(得分:0)

我可以从问题陈述中收集到: -

  1. 人 - 没有工作就可以存在。可以有零个或多个工作。
  2. 工作 - 可以独立于执行它的人员而存在。
  3. 更简洁的方法是拥有一个封装此映射的实体(及其表): -

    class Employment{
         private Person person;
         private Job job;
    }
    

    现在您可以从两端进行查询。如: -

    • 从员工中选择PERSON.ID = xyz

    这可能会产生0行或更多行。

    每一行都会有映射Job的信息。

    因此,在这种情况下,您将拥有类似的服务/存储库: -

    interface EmployementRepository{
    
       //  CRUD methods on Employement.
    }
    

答案 2 :(得分:0)

这听起来像是在处理多对多关系。如果多人可以拥有相同的工作,则需要创建联结表。

数据模型

CREATE TABLE PERSON(PERSON_ID, OTHER_FIELDS);
CREATE TABLE JOB(JOB_ID, OTHER_FIELDS);
CREATE TABLE PERSON_JOB(PERSON_JOB_ID, PERSON_ID, JOB_ID, OTHER_FIELDS);

<强>实体

class Person{
    List<Job> jobs = new ArrayList<Job>();
}

class Job{
    List<Person> workers = new ArrayList<Person>();
}

在repository / dao层中,您需要创建逻辑以使用联结表填充这两个实体之间的关联。