我是 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 作为字段?可以吗?
您认为对我的情况最好的建筑选择是什么?
答案 0 :(得分:2)
对此持怀疑态度是完全正确的。
错误是假设每个实体应该有一个存储库。相反,你应该从域驱动设计中研究聚合根的概念。
聚合根是一个实体,用于操作一组只能通过聚合根访问和修改的实体。
您希望每个这样的聚合根存储一个存储库,在您的情况下就是Room。
Spring数据项目负责人Oliver Gierke在this article中对此进行了更详细的解释。