@Nevars

Как сохранить сложную сущность в JPA?

Всем привет. Возник вопрос недопониманием одного момента.

Предположим есть класс
@Entity
@Cacheable
public class Agenda {

    @Id
    @GeneratedValue
    private Integer id;

    @ManyToOne
    @JoinColumn(name = "event")
    private Event event;

    @Size(max = 4000)
    private String name;

    @Size(max = 4000)
    private String subject;

    private Date startDateTime;

    private Date endDateTime;

    @ManyToOne
    @JoinColumn(name = "room")
    private Room room;

    @ManyToOne
    @JoinColumn(name = "classifier")
    private Classifier classifier;

    private Date datetime;

    @ManyToOne
    @JoinColumn(name = "composer")
    private Profile composer;

    @Version
    private Integer version;

    private boolean enable;

    @Size(max = 250)
    private String lector;

    .... get'еры и set'еры


Я принимаю данную сущность в контроллере

@RequestMapping(method = RequestMethod.POST
            consumes = MediaType.APPLICATION_JSON_VALUE,
            produces = MediaType.APPLICATION_JSON_VALUE)
    public Agenda addAgenda(@RequestBody Agenda agenda) {
        return agendaService.addAndReturn(agenda);
    }


В качестве Room, Classifier, Profile, Event я должен принять только id'шники. Вопрос: как, зная эти самые айдишники, сохранить сущность Agenda в базу и при этом не городить огород в духе "на уровне сервиса определим соответственно репозитории сущностей Room, Classifier, Profile, Event", так как ради одного метода инжектить несколько репозитории не совсем хочется + я считаю не совсем разумно делать несколько запросов для извлечения соответствующих сущностей по айдишникам, а потом сохранять их в Agenda.

Скажите, пожалуйста, есть ли более изящный способ обойти эту проблему?
  • Вопрос задан
  • 1036 просмотров
Пригласить эксперта
Ответы на вопрос 1
@bobzer
Java EE Developer
Есть "топорный" способ: перед сохранением создайте новые экземпляры "Room, Classifier, Profile, Event", подставьте в них "эти самые айдишники", затем подставьте экземпляры в Agenda.

Хотите изящности - пересмотрите архитектуру. Как вариант, мапить в Agenda не классы, а простые поля - идентификаторы. Обмениваться между клиентом и сервером такими легковесными сущностями, а уже на клиенте подставлять экземпляры, доставая их из отдельных хранилищ. Таким образом работает, например, ExtJs, предоставляя удобные функции для "разворачивания" ID-шников в экземпляры при отображении пользователю и "сворачивая" обратно при передаче на сервер.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы