Я довольно новое в Spring Data JPA и у меня есть следующие сомнения по поводу наиболее оптимальным образом реализовать следующую ситуацию:Лучший архитектурный выбор объединить 2 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, которые представляют собой Типология комнаты (что-то вроде: одноместный номер, двухместный номер кровать, etcetc):
@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
}
Ok, используя Spring Data JPA У меня будет 2 разных классов репозитория (один для номер объекта класса и еще один для 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 аннотацию (потому что, начиная с определенной комнаты Типология Я хочу получить доступ ко всей комнате этого размещения в этой типологии: все односпальная кровать или весь номер с двуспальной кроватью и т. д.).
Итак, следуя этот архитектурный стиль, у меня будет метод, вернуть список, связанный с комнатной Типологией в RoomTipologyDAO класс хранилища, а не в RoomTipology хранилища class..it работает нормально, но это семантически плохо, потому что у меня будет метод RoomTipologyDAO, который не возвращает что-то связанное с RoomTipology экземпляр, но список Номер объект.
Разве это не противно?
Так какой лучший способ создать архитектуру, которая использует Spring Data JPA в этом случае?
я не могу не сделать что-то вроде:
public interface RoomDAO extends JpaRepository<Room, Long> extends JpaRepository<RoomTipology, Long> {
........................................................
........................................................
........................................................
}
потому, что Java не поддерживает множественное наследственность, но я думаю, что лучший выбор должен получить что-то вроде этого.
Может я могу создать нечто вроде RoomMetaDAO класса, которые имеют RoomDAO и RoomTipologyDAO как поле? Может ли это работать?
Как вы думаете, что может быть лучшим архитектурным выбором для моей ситуации?
Я не вижу здесь ничего плохого. Не нужно возиться с хранилищем, как это, держать его простым и держать их отдельно, только для одного объекта в то время, иначе это запутывает, если вы предпочитаете использовать их в других отношениях в будущем. Также используйте Set вместо List, если вы не планируете их заказывать. – Vaelyr
* У меня будет метод, который возвращает список, связанный с типом комнаты, в репозиторий RoomTipologyDAO *: зачем вы это делаете? Если вам действительно нужен этот метод (вместо получения типологии и вызова getRooms()), поместите его в RoomDAO.findByTopology(). –