2016-11-26 2 views
0

Я довольно новое в 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 как поле? Может ли это работать?

Как вы думаете, что может быть лучшим архитектурным выбором для моей ситуации?

+1

Я не вижу здесь ничего плохого. Не нужно возиться с хранилищем, как это, держать его простым и держать их отдельно, только для одного объекта в то время, иначе это запутывает, если вы предпочитаете использовать их в других отношениях в будущем. Также используйте Set вместо List, если вы не планируете их заказывать. – Vaelyr

+1

* У меня будет метод, который возвращает список, связанный с типом комнаты, в репозиторий RoomTipologyDAO *: зачем вы это делаете? Если вам действительно нужен этот метод (вместо получения типологии и вызова getRooms()), поместите его в RoomDAO.findByTopology(). –

ответ

1

Вы абсолютно правы в том, что скептически относитесь к этому.

Ошибка заключается в том, что у вас должен быть один репозиторий на сущность. Вместо этого вы должны изучить концепцию совокупных корней из проекта, управляемого доменом.

Агрегированный корень - это объект, который используется для манипулирования связкой сущностей, которые могут быть доступны и изменены только через совокупный корень.

Вы хотите, чтобы один репозиторий на такой совокупный корень, который был бы в вашем случае в Комнате.

Это объясняется более подробно в this article от Oliver Gierke, ведущего проекта Spring Data.

+0

Tnx так много, это абсолютно то, что мне нужно. Есть ли у вас пример кода? – AndreaNobili