Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用SpringDataJPA获得领域驱动的设计架构?_Java_Spring_Spring Data_Domain Driven Design_Spring Data Jpa - Fatal编程技术网

Java 如何使用SpringDataJPA获得领域驱动的设计架构?

Java 如何使用SpringDataJPA获得领域驱动的设计架构?,java,spring,spring-data,domain-driven-design,spring-data-jpa,Java,Spring,Spring Data,Domain Driven Design,Spring Data Jpa,我正在开发一个Spring应用程序,它使用Spring数据JPA访问数据层 因此,基本上我有n个实体类和n个相关的存储库类来访问与实体类关联的数据库表的数据,如下所示: @Repository @Transactional(propagation = Propagation.MANDATORY) public interface EntityType1DAO extends JpaRepository<EntityType1, Long> { //@Query("FROM R

我正在开发一个Spring应用程序,它使用Spring数据JPA访问数据层

因此,基本上我有n个实体类n个相关的存储库类来访问与实体类关联的数据库表的数据,如下所示:

@Repository
@Transactional(propagation = Propagation.MANDATORY)
public interface EntityType1DAO extends JpaRepository<EntityType1, Long> {

   //@Query("FROM Room WHERE accomodation = :id")
   List<EntityType1> findByEntityType1(EntityType1 entityType1);

}

@Repository
@Transactional(propagation = Propagation.MANDATORY)
public interface EntityType2DAO extends JpaRepository<EntityType2, Long> {

   List<EntityType2> findByEntityType2(EntityType2 entityType2);

}

...........................................................................
...........................................................................
...........................................................................

@Repository
@Transactional(propagation = Propagation.MANDATORY)
public interface EntityTypeNDAO extends JpaRepository<EntityTypeN, Long> {

   List<EntityTypeN> findByEntityTypeN(EntityTypeN entityTypeN);

}
@存储库
@事务性(传播=传播。强制)
公共接口EntityType1DAO扩展了JpaRepository{
//@查询(“来自住宿=:id的房间”)
列出查找到的EntityType1(EntityType1 EntityType1);
}
@存储库
@事务性(传播=传播。强制)
公共接口EntityType2DAO扩展了JpaRepository{
列出查找到的EntityType2(EntityType2 EntityType2);
}
...........................................................................
...........................................................................
...........................................................................
@存储库
@事务性(传播=传播。强制)
公共接口EntityTypeNDAO扩展了JpaRepository{
列表findbyentitypen(EntityTypeN entitypen);
}
因此,基本上通过这种方式,n个域类由**n个存储库类访问

我可以将这些n个域类划分为属于一个共同概念的子集

例如,我可以有如下实体类:RoomRoomTipologyRoomRateRoomPicture,它们都属于房间概念

因此,我将开设以下服务课程:RoomDAORoomTipologyDAORoomRateDAORoomPictureDAO

它工作得很好,但我想采用一种更领域驱动的设计体系结构

因此,我发现了这篇关于如何在Spring应用程序中获得领域驱动设计的有趣文章:

阅读前一篇文章,它说:

Repository—Spring组件,通常是Spring数据存储库 接口。可以依赖于图元和值对象,它们居中 围绕作为聚合根的实体

到底是什么意思?这意味着我可以使用@Embedded注释创建一个聚合根类(例如RoomAggregation,它聚合了我的房间RoomTipologyRoomRateRoomPicture实体类)

还是什么


使用Spring Data JPA在我的应用程序中获得域驱动设计的好架构解决方案是什么?

您不需要创建一个新类作为聚合。取而代之的是你选择一个退出的。通常它会自己出现,在您的示例中,它可能是
房间

因此,您将拥有一个房间存储库(
RoomRepository
rooms
可能)。您可以使用它来保存和加载房间,包括根据所需的各种条件查找房间

为了访问(和操纵)例如
RoomPicture
您加载
RoomPicture
导航到
RoomPicture
操纵它并保存JPA会话,这基本上意味着您正在修改房间


如果您选择实体之间的简单导航(@OneToMany和gang)或@Embedded ist不受您选择的聚合的影响,除非您没有从一个聚合到另一个聚合的直接引用。因此,如果您也有
Booking
作为聚合对象,那么
Booking
将包含
roomId
,您将使用房间存储库查找房间。

首先,忘记Spring数据JPA或任何其他持久性机制。领域驱动设计是关于在分析中对领域进行建模,您的特定案例是关于对某些类型的酒店子域进行建模,而根本不担心持久性。这是另一个完全不同的关注点,与酒店无关,但与持久性(另一个域或有界上下文)有关

您必须从用例而不是概念的角度来思考,这样我们才能识别行为,并通过这种方式检测不变量,从而允许我们考虑围绕必须始终保持一致的内容建立边界

记住按照Vaughn的建议对小的聚合进行建模,所以你的大聚合想法听起来并不好。酒店经理可能会实例化一个房间来实际表示一个房间,并给它一个数字和一些其他东西。那么价格和图片呢?让我们以价格为例,让我问你,一个房间真的知道它的价格吗?房价不是动态的,完全受很多其他变量的影响吗,比如日期?那么,为什么要在房间集合内固定费率呢?我们说过,在现实世界中,房间对这种责任不负责任,价格受房间边界以外发生的几种情况的影响。所以这个比率对于一个房间来说完全是偶然的,如果我们用哲学术语来讨论的话,它不是必要的

另一个聚合是PriceList,它的聚合根具有相同的名称。因此,您可以询问价目表,特定日期的房间价格(标准房、豪华房等),它会知道价格:) 根据您对所有这些内容的建模方式,这可能属于作为微服务公开的定价受限上下文,但不要担心 关于它。PriceList是另一个与房间完全隔离的集合,通过其概念标识(房间号)引用房间

这同样适用于RoomPicture。在这种特殊情况下,请认为处理相册图片的部门/区域/员工可能不是经理,而是具有不同角色并创建具有自己生命周期的房间相册的其他人

作为conc