合并2个Spring Data JPA存储库类

时间:2016-11-26 16:20:31

标签: java spring spring-mvc spring-data spring-data-jpa

我是 Spring Data JPA 中的新手,我对实现以下情况的最佳方式存在以下疑问:

所以基本上我有以下2个模型类:

房间(代表住宿的房间):

@Entity
@Table(name = "room")
public class Room implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @ManyToOne
    @JoinColumn(name = "id_accomodation_fk", nullable = false)
    private Accomodation accomodation;

    @ManyToOne
    @JoinColumn(name = "id_room_tipology_fk", nullable = false)
    private RoomTipology roomTipology;

    @Column(name = "room_number")
    private String number;

    @Column(name = "room_name")
    private String name;

    @Column(name = "room_description")
    @Type(type="text")
    private String description;

    @Column(name = "max_people")
    private Integer maxPeople;

    @Column(name = "is_enabled")
    private Boolean isEnabled;

    public Room() {
    }

    // GETTER AND SETTER METHODS
}

RoomTipology 代表房间的尖端(如:单人间,双人间,等等):

@Entity
@Table(name = "room_tipology")
public class RoomTipology implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @Column(name = "tipology_name")
    private String name;

    @Column(name = "tipology_description")
    private String description;

    @Column(name = "time_stamp")
    private Date timeStamp;


    @OneToMany(mappedBy = "roomTipology")
    private List<Room> rooms;

    @OneToOne(mappedBy = "roomTipology")
    private RoomRate roomRate;

    // GETTER AND SETTER METHODS
}

好的,使用Spring Data JPA我将有2个不同的存储库类(一个用于 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

}

好的,我有以下架构疑问:

我有两个小的存储库类,可以访问语义相似的东西(房间概念和房间概念都与房间有关)。

此外,正如您在 RoomTipology 实体类的代码中所看到的,还有以下字段:

@OneToMany(mappedBy = "roomTipology")
private List<Room> rooms;

@OneToMany 注释映射(因为从特定的房间提示开始,我想访问此tipology的所有房间:所有单人房或所有双人房卧室等等......)。

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

这不是很讨厌吗?

那么在这种情况下创建使用 Spring Data JPA 的架构的最佳方法是什么?

我不能做类似的事情:

public interface RoomDAO extends JpaRepository<Room, Long> extends JpaRepository<RoomTipology, Long> {
    ........................................................
    ........................................................
    ........................................................
}

因为Java并不支持多重遗传,但我认为最好的选择应该是这样的。

也许我可以创建类似 RoomMODAO 类的 RoomDAO RoomTipologyDAO 作为字段?可以吗?

您认为对我的情况最好的建筑选择是什么?

1 个答案:

答案 0 :(得分:2)

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

错误是假设每个实体应该有一个存储库。相反,你应该从域驱动设计中研究聚合根的概念。

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

您希望每个这样的聚合根存储一个存储库,在您的情况下就是Room。

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