不同层次的实体组合

时间:2018-11-16 08:35:37

标签: java spring-data-jpa data-access-layer data-layers

假设我有以下课程:

@Entity
public class Book {
...
}

@Repository
public class BookRepositoryImpl implements BookRepository {    
...
}

@Service
public class BookServiceImpl implements BookService {
...
}


@Entity
public class Author{
...
}

@Repository
public class AuthorRepositoryImpl implements AuthorRepository {
...
}

@Service
public class AuthorServiceImpl implements AuthorService {
...
}

现在,我想和一位作者保存一本书。我以某种方式将BookDto传递给我的BookService,其中包括作者以外的所有信息,而我作为第二个参数传递作者ID。现在要保存我的书,我必须组装书实体。哪一层是正确的创建层?我看到的可能性很小,但是我不确定哪种方法是正确的:

  • 在BookingService.createBook中,我可以调用AuthorService.findAuthorById并使用此组装的Book,然后将其传递给BookRepository
  • 在BookingService.createBook中,我可以调用AuthorRepository.findAuthorById并使用此组装的Book,然后将其传递给BookRepository
  • 我可以将所有信息传递到存储库并让其处理实体,这是我的意思:在BookingService.createBook中调用BookRepository.saveBookWithAuthor(Book,Long authorId),在此方法中,我可以调用AuthorRepository.findAuthorById或我可以调用AuthorService.findAuthorById,组装Book实体并将其持久化

哪种方法是正确的,为什么?在我看来,逻辑解决方案是第一个解决方案,但是我不喜欢将实体组装与可能包含在我的服务中的某些业务逻辑混合的想法。是否存在将业务逻辑与技术解决方案区分开的模式?

1 个答案:

答案 0 :(得分:1)

您可以使用 BookingService.createBook 组装数据。因为一本书必须至少有一位作者。服务层用于业务逻辑。您需要将所有数据指定到该层中。您可以从 AuthorService 调用 AuthorRepository ,但必须从 BookService 调用 AuthorService 。因为 BookService 无法直接使用 AuthorRepository 。因此,请在 AuthorService 上定义一种方法,以按ID获取作者,然后从 BookService 调用 AuthorService 服务方法。您可以通过服务层访问每个存储库,因为要获取数据,每个服务在此数据后面都有一些逻辑要返回。每个服务层都负责其存储库层。

因此,定义 AuthorService.findAuthorById(long id),然后从BookService调用此方法,并在bookservice处组装数据。