3

我使用 Spring MVC 和常规 JDBC。

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

假设我想得到一个未知person的对象(延迟加载)。job但是系统可能会在以后询问job该特定person内容是什么。在这种情况下,每一层的作用是什么?

如果我需要在这个问题中添加任何细节,请告诉我。

4

3 回答 3

0

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

class Person {
 Set<Job> jobs;
}

class Job {
 Person person;
}

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

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

于 2013-10-22T09:39:56.943 回答
0

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

  1. 人——可以在没有工作的情况下存在。可以有零个或多个作业。
  2. 工作 - 可以独立于执行它的人而存在。

一种更简洁的方法是拥有一个封装此映射的实体(以及它的表):-

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

现在您可以从两端查询。喜欢:-

  • 从 PERSON.ID=xyz 的雇员中选择

这可能会给出 0 行或更多行。

每行也会有映射作业的信息。

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

interface EmployementRepository{

   //  CRUD methods on Employement.
}
于 2013-10-22T09:50:43.507 回答
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>();
}

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

于 2013-10-22T10:00:39.783 回答