不同层次的实体组合
Entity assemblage in different 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 {
...
}
现在我想保存一本有作者的书。对于我的 BookService,我以某种方式将 BookDto 传递给除作者以外的所有信息,并且作为第二个参数,我传递了作者 ID。现在要保存我的书,我必须 assemble 书实体。哪一层是创建它的正确层?我看到很少的可能性,但我不确定哪种方法是正确的:
- 在 BookingService.createBook 我可以调用 AuthorService.findAuthorById 并使用这本 assemble 书,然后将它传递给 BookRepository
- 在 BookingService.createBook 我可以调用 AuthorRepository.findAuthorById 并使用这本 assemble 书,然后将它传递给 BookRepository
- 我可以将所有信息传递给存储库并让它处理实体,通过这个创建我的意思是:在 BookingService.createBook 调用 BookRepository.saveBookWithAuthor(Book book, Long authorId) 并且在这个方法中我可以调用AuthorRepository.findAuthorById 或者我可以调用 AuthorService.findAuthorById,assemble 预订实体并保留它
哪种方法是正确的,为什么?在我看来,一个合乎逻辑的解决方案是第一个,但是我不喜欢将实体 assemble 与我的服务中可能存在的某些业务逻辑混合在一起的想法。是否有一种模式可以将业务逻辑与技术解决方案分开?
您可以使用BookingService.createBook到assemble数据。因为一本书必须至少有一个作者。服务层用于业务逻辑。您需要将所有数据指定到该层中。您可以从 AuthorService 调用 AuthorRepository 但您必须从 BookService[ 调用 AuthorService =25=]。因为BookService不能直接使用AuthorRepository。因此,在 AuthorService 上定义一个方法以通过 ID 获取作者并从 BookService 调用 AuthorService 服务方法。您可以通过它的服务层访问每个存储库,因为要获取数据,每个服务在这些数据背后都有一些逻辑 return。每个服务层都负责其存储库层。
所以定义AuthorService.findAuthorById(long id)然后从BookService和assemble数据在bookservice调用这个方法
假设我有以下 类:
@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 {
...
}
现在我想保存一本有作者的书。对于我的 BookService,我以某种方式将 BookDto 传递给除作者以外的所有信息,并且作为第二个参数,我传递了作者 ID。现在要保存我的书,我必须 assemble 书实体。哪一层是创建它的正确层?我看到很少的可能性,但我不确定哪种方法是正确的:
- 在 BookingService.createBook 我可以调用 AuthorService.findAuthorById 并使用这本 assemble 书,然后将它传递给 BookRepository
- 在 BookingService.createBook 我可以调用 AuthorRepository.findAuthorById 并使用这本 assemble 书,然后将它传递给 BookRepository
- 我可以将所有信息传递给存储库并让它处理实体,通过这个创建我的意思是:在 BookingService.createBook 调用 BookRepository.saveBookWithAuthor(Book book, Long authorId) 并且在这个方法中我可以调用AuthorRepository.findAuthorById 或者我可以调用 AuthorService.findAuthorById,assemble 预订实体并保留它
哪种方法是正确的,为什么?在我看来,一个合乎逻辑的解决方案是第一个,但是我不喜欢将实体 assemble 与我的服务中可能存在的某些业务逻辑混合在一起的想法。是否有一种模式可以将业务逻辑与技术解决方案分开?
您可以使用BookingService.createBook到assemble数据。因为一本书必须至少有一个作者。服务层用于业务逻辑。您需要将所有数据指定到该层中。您可以从 AuthorService 调用 AuthorRepository 但您必须从 BookService[ 调用 AuthorService =25=]。因为BookService不能直接使用AuthorRepository。因此,在 AuthorService 上定义一个方法以通过 ID 获取作者并从 BookService 调用 AuthorService 服务方法。您可以通过它的服务层访问每个存储库,因为要获取数据,每个服务在这些数据背后都有一些逻辑 return。每个服务层都负责其存储库层。
所以定义AuthorService.findAuthorById(long id)然后从BookService和assemble数据在bookservice调用这个方法