Почему Spring Data Rest разрешает обновления только со стороны владельца ManyToOne / ManyToMany? - PullRequest
5 голосов
/ 04 ноября 2019

Я скачал пример проекта отсюда https://www.baeldung.com/spring-data-rest-relationships

Затем я запустил его и сделал несколько тестовых вызовов REST. Насколько я могу сказать, вы можете обновить ассоциацию только со стороны владельца, используя SDR. Я имею в виду

public class Book {
    @ManyToOne
    @JoinColumn(name = "library_id")
    private Library library;
}

и

public class Library {
    @OneToMany(mappedBy = "library")
    private List<Book> books;
}

На самом деле вы не можете звонить по почте / ставить в / библиотеки / 1 / книги. Сервер возвращает 204, но никак не влияет на БД.

Тем не менее, вы можете отправлять / отправлять вызовы / books / 1 / library, и все работает, как задумано, включая синхронизацию другого объекта.

Это нормально? То же самое относится и к @ManyToMany. Есть ли способ разрешить обновления с обеих сторон? Если я напишу свой собственный API, я, безусловно, смогу это сделать. Почему SDR не делает этого?

Ответы [ 2 ]

2 голосов
/ 11 ноября 2019

Это нормально?

В некотором смысле, да. Именно так будет вести себя чистый JPA, когда вы добавляете Book в коллекцию Library.books с вашим текущим отображением - это ничего не изменит.

Я предполагаю, что Spring Data Rest не знает (или не заботится), какая сторона ассоциации является стороной владельца, и просто не делает лишнюю милю, чтобы убедиться, что обновление обратной стороны также работает,

Есть ли способ разрешить обновления с обеих сторон?

Обходной путь может быть , просто притворяясь, что обе стороны ассоциаций быливладеющая сторона, то есть:

public class Library {

    @OneToMany
    @JoinColumn(name = "library_id")
    private List<Book> books;
}

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

0 голосов
/ 15 ноября 2019

Обновление двунаправленных отношений с обеих сторон очень сложно и может вызвать побочные эффекты, учитывая авторизацию конечной точки Springs или RESTs Spring Data BeforeLinkSaveEvent и AfterLinkSaveEvent (https://docs.spring.io/spring-data/rest/docs/current/reference/html/#events).

Должно бытьстрогое родительское отношение. Не думаю, что вы можете настроить желаемое поведение.

...