Java 合并2个Spring数据JPA存储库类的最佳架构选择

Java 合并2个Spring数据JPA存储库类的最佳架构选择,java,spring,spring-mvc,spring-data,spring-data-jpa,Java,Spring,Spring Mvc,Spring Data,Spring Data Jpa,我是Spring Data JPA的新手,我对实现以下情况的最佳方法有以下疑问: 因此,基本上我有以下两个模型类: 房间(表示住宿房间): 和RoomTipology表示房间的tipology(类似于:单人房、双人房等): @实体 @表(name=“room\u tipology”) 公共类RoomTipology实现了可序列化{ @身份证 @GeneratedValue(策略=GenerationType.IDENTITY) @列(name=“id”) 私人长id; @列(name=“tipo

我是Spring Data JPA的新手,我对实现以下情况的最佳方法有以下疑问:

因此,基本上我有以下两个模型类:

房间(表示住宿房间):

RoomTipology表示房间的tipology(类似于:单人房、双人房等):

@实体
@表(name=“room\u tipology”)
公共类RoomTipology实现了可序列化{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“id”)
私人长id;
@列(name=“tipology\u name”)
私有字符串名称;
@列(name=“tipology\u description”)
私有字符串描述;
@列(name=“时间戳”)
私有日期时间戳;
@OneToMany(mappedBy=“roomTipology”)
私人名单室;
@OneTONE(mappedBy=“roomTipology”)
私人房费;
//GETTER和SETTER方法
}
好的,使用Spring数据JPA,我将有两个不同的存储库类(一个用于Room实体类,另一个用于RoomTipology实体类,如下所示:

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

   //@Query("FROM Room WHERE accomodation = :id")
   List<Room> findByAccomodation(Accomodation accomodation);

}

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

   // METHOD RELATED TO THE ACCESS TO ROOM TIPOLOGY ENTITIES

}
@存储库
@事务性(传播=传播。强制)
公共接口RoomDAO扩展了JpaRepository{
//@查询(“来自住宿=:id的房间”)
列出找到的住宿(住宿);
}
@存储库
@事务性(传播=传播。强制)
公共接口室Tipologydao扩展了JpaRepository{
//与访问ROOM TIPOLOGY实体相关的方法
}
好的,我有以下建筑方面的疑问:

我有两个小的repositories类,它们访问语义相似的东西(room概念和room tipology概念都与room相关)

此外,您可以在RoomTipology实体类的代码中看到以下字段:

@OneToMany(mappedBy = "roomTipology")
private List<Room> rooms;
@OneToMany(mappedBy=“roomTipology”)
私人名单室;
这是由@OneToMany注释映射的(因为从一个特定的房间主题开始,我想进入这个主题的所有房间:所有单人房或所有双人房等等…)

因此,遵循这种架构风格,我将有一种方法,将与room tipology关联的列表返回到RoomTipologyDAO存储库类,而不是返回到RoomTipology存储库类。它工作正常,但在语义上不好,因为我将使用RoomTipolo方法gyDAO返回的不是与RoomTipology实例相关的内容,而是Room对象的列表

这不恶心吗

那么,在这种情况下,创建使用Spring数据JPA的体系结构的最佳方法是什么呢

我不能做这样的事情:

public interface RoomDAO extends JpaRepository<Room, Long> extends JpaRepository<RoomTipology, Long> {
    ........................................................
    ........................................................
    ........................................................
}
public interface RoomDAO扩展JpaRepository扩展JpaRepository{
........................................................
........................................................
........................................................
}
因为Java不支持多重遗传,但我认为最好的选择应该是这样的

也许我可以创建一个类似于RoomMetaDAO类的类,它有RoomDAORoomTipologyDAO作为字段?它能工作吗


对于我的情况,您认为什么是最好的架构选择?

您对此持怀疑态度是完全正确的

错误在于假设每个实体应该有一个存储库,而应该从域驱动设计的角度研究聚合根的概念

聚合根是一个实体,用于操作只能通过聚合根访问和修改的一组实体

您希望每个这样的聚合根目录都有一个存储库,在您的案例中,就是房间


Spring数据项目负责人Oliver Gierke对此进行了更详细的解释。

我看不出这里有任何错误。不必像那样乱处理存储库,保持简单并将它们分开,每次只针对一个实体,否则,如果您希望在将来的其他关系中使用它们,就会产生混乱。也可以使用Set如果您不打算对它们进行排序,请不要使用List。我将使用一种方法将与RoomTipology相关联的列表返回到RoomTipologyDAO存储库中:为什么要这样做?如果您确实需要该方法(而不仅仅是获取类型并调用getRooms()),请将其放在RoomDAO.FindBytology()中.Tnx太多了,这绝对是我需要的。你还有一些代码示例吗?
@OneToMany(mappedBy = "roomTipology")
private List<Room> rooms;
public interface RoomDAO extends JpaRepository<Room, Long> extends JpaRepository<RoomTipology, Long> {
    ........................................................
    ........................................................
    ........................................................
}