gpt4 book ai didi

java - 合并 2 个 Spring Data JPA 存储库类的最佳架构选择

转载 作者:行者123 更新时间:2023-12-02 03:12:35 26 4
gpt4 key购买 nike

我对 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

}

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

我有 2 个小存储库类,它们可以访问语义相似的内容(房间概念和房间拓扑概念都与房间相关)。

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

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

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

因此,按照这种架构风格,我将拥有将与房间拓扑相关联的 List 返回到 RoomTipologyDAO 存储库类而不是 RoomTipology 存储库类..它工作正常,但在语义上很糟糕,因为我将有一个 RoomTipologyDAO 方法,它不会返回与 RoomTipology 实例相关的内容,但Room 对象列表。

这不是很恶心吗?

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

我不能不做这样的事情:

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

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

也许我可以创建类似 RoomMetaDAO 类的内容,其中包含 RoomDAORoomTipologyDAO 作为字段?可以用吗?

您认为最适合我的情况的架构选择是什么?

最佳答案

您对此表示怀疑是完全正确的。

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

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

您希望每个此类聚合根都有一个存储库,在您的情况下就是 Room。

这在this article中有更详细的解释。作者:Oliver Gierke,Spring Data 项目负责人。

关于java - 合并 2 个 Spring Data JPA 存储库类的最佳架构选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40820386/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com