Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Entity merge / 25 сообщений из 63, страница 1 из 3
15.12.2021, 23:02
    #40120436
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity merge
Как лучше обновлять entity имеющие у себя дочерние связи?

Вот например Person entity... При update
Я получаю по id нужную мне entity, проставлю новые значение и сохраняю... Тут вопрос нет

Вопрос если в Person entity есть поля например

@OneToMany
Set<BookEntity> books

И когда приходит на обновление PersonDto , мне надо
Какую-то BookEntity обновить, какую-то добавить, какую-то удалить... Грубо говоря смержить два листа

Было б это в одном месте, я б написал в конвертере такую вещь

Проблема в другом, когда мне передаётся вся иерархия PersonDto для обновления такое место не одно...

Может есть какой-то подход, как правильно обновлять такие вещи

PS пардон за форматирование, с телефона
...
Рейтинг: 0 / 0
15.12.2021, 23:10
    #40120439
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity merge
Как вижу я сейчас

Писать метод, куда будет передаваться Set<Entity> , Set<Dto> и Converter<Entity, Dto>

Далее

1 бегу по Set<Entity> и ищу Id в Set<Dto>, если нахожу то такие Entity надо обновить convert.update(entity, Dto)

2 если не нахожу, то такие Entity надо удалить

3 бегу по Set<Dto> если есть Dto с I'd null, то считаю , что это новые записи и их надо создать, converter. create(dto)

И в итоге формирую уже конечный сет

Но думаю, что уже кто-то делал подобное, может есть варианты проще)
...
Рейтинг: 0 / 0
15.12.2021, 23:20
    #40120443
Entity merge
Если на минутку забыть про Hibernate, у Book обязана быть ID? Иными словами: работаем ли мы с Book вне Person? Ссылается ли еще кто-то на Book кроме него, или может мы Book по ID запрашиваем отдельно?
...
Рейтинг: 0 / 0
15.12.2021, 23:27
    #40120445
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity merge
Id это primary key из БД

Да я могу получить
Список всех книг определенного person
Или определенную книги по ее Id

Но вот обновлять надо все связке.. приходит PersonDTo
...
Рейтинг: 0 / 0
15.12.2021, 23:32
    #40120446
Entity merge
Спрошу по-другому - могли бы мы вообще удалить колонку ID из таблицы BOOKS? Например, запросить все книги Person'a можно и без нее, для этого use case'a нам колонка ID не нужна.
...
Рейтинг: 0 / 0
16.12.2021, 00:03
    #40120450
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity merge
Stanislav Bashkyrtsev,

А можете немного развернуть свою мысль?
Под конец дня немного голова не соображает


Если тупо удалить, то нет не могу.. В entity надо поле, id... Чисто теоретически primary key book , может совпадать с primary key person... Книги будут уникальный для каждого человека

Или вы подталкиваеете меня в SQL бд сделать nosql
Хранить информацию о книгах в виде json напрмер
...
Рейтинг: 0 / 0
16.12.2021, 00:52
    #40120453
Entity merge
Хранить книги в JSON колонке - тоже вариант. Но опять же - только если книги составляют композицию с человеком (человек определяет жизненный цикл книги и та не существует вне человека).

Реляционный же подход в таком случае - это использовать таблицы без ID (в JPA это @ElementCollection - собсно у таких элементов нет ID). И ORM будет перезаписывать списки сам. Все сводится к тому чтоб удалить сначала все записи этого человека, а потом вставить все записи из обновленной коллекции. Т.к. на книгу больше никто не ссылается, то пересоздание записи не приводит к побочным эффектам.
...
Рейтинг: 0 / 0
16.12.2021, 03:15
    #40120461
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity merge
Stanislav Bashkyrtsev,

Попробовал я ElementCollection да отлично работает, Но
Если BookEntity Содержит в себе OneToMany , то тут уже проблема начинается,

@ Embeddable yне может содержать @Id
...
Рейтинг: 0 / 0
16.12.2021, 04:00
    #40120462
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity merge
Добавил два метода updateEntity

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
public interface Converter<D extends BaseDto, E extends BaseEntity> {

  default E convertDto(D dto) {
    return convertDto(dto, false);
  }

  E convertDto(D dto, boolean full);

  default Stream<E> convertDto(Set<D> dtos, boolean full) {
    return Stream.ofNullable(dtos)
        .flatMap(Collection::stream)
        .map(dto -> convertDto(dto, full));
  }

  default D convertEntity(E entity) {
    return convertEntity(entity, false);
  }

  D convertEntity(E entity, boolean full);

  default Set<D> convertEntity(Set<E> entities, boolean full) {
    return Stream.ofNullable(entities)
        .flatMap(Collection::stream)
        .map(entity -> convertEntity(entity, full))
        .collect(Collectors.toSet());
  }

  default E updateEntity(E entity, D dto, boolean full) {
    throw new UnsupportedOperationException("Current operation doesn't support");
  }

  default Stream<E> updateEntity(Set<D> dtos, Set<E> entities, boolean full) {
    return dtos.stream()
        .map(dto -> updateEntity(findEntity(entities, dto.getId()), dto, full));
  }

  private E findEntity(Set<E> entities, UUID uuid) {
    return entities.stream()
        .filter(limitSignatureEntity -> Objects.equals(limitSignatureEntity.getId(), uuid))
        .findAny()
        .orElse(null);
  }
}



Которые уже или обновляют существующие entity если id совпало, или конвертируют их в новые
...
Рейтинг: 0 / 0
16.12.2021, 07:06
    #40120467
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity merge
-=Koba=-
Проблема в другом, когда мне передаётся вся иерархия PersonDto для обновления такое место не одно...

Может есть какой-то подход, как правильно обновлять такие вещи

При REST таких случаев возникать не должно.
Напр
Http://sql.ru/app/person/345
Передаем персоне список книг. Дальше?
...
Рейтинг: 0 / 0
16.12.2021, 07:09
    #40120468
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity merge
Stanislav Bashkyrtsev
человек определяет жизненный цикл книги и та не существует вне человека).
вот с этого и начинай.
Существует ли сущность книга отдельно?
А то куда то в сторону повел про встроенные книги в человеке)
...
Рейтинг: 0 / 0
16.12.2021, 07:13
    #40120470
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity merge
-=Koba=-
Какую-то BookEntity обновить, какую-то добавить, какую-то удалить... Грубо говоря смержить два листа

По REST merge делает клиент.
Он делает delete и передает список УДАЛЯЕМЫХ книг.
Тупо, просто и гениально))))
...
Рейтинг: 0 / 0
16.12.2021, 07:41
    #40120474
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity merge
В данном случае передается объект Person
Новым списком кнмг
...
Рейтинг: 0 / 0
16.12.2021, 08:26
    #40120478
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity merge
-=Koba=-
В данном случае передается объект Person
Новым списком кнмг

Говори еще яснее.
На урл Http://sql.ru/app/person/345

Передается персона с айди 346?
...
Рейтинг: 0 / 0
16.12.2021, 08:27
    #40120479
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity merge
-=Koba=-,
API на бэке проектируешь ты?
...
Рейтинг: 0 / 0
16.12.2021, 09:02
    #40120486
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity merge
PetroNotC Sharp,

Да все верно
Http://sql.ru/app/person/345

Передается иерахические данные по персону
...
Рейтинг: 0 / 0
16.12.2021, 09:14
    #40120490
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity merge
-=Koba=-,
Блин, да что верно то?
Айди совпадает?
Модификаторы CRUD отпавляем?
Если отправляем по стандарту рест, тогда ты отправляешь при добавить только новые книги.
Если не отправляем, тогда ты можешь тупо удалить все что в бд и записать новое состояние книг персоны.
Ферштейн?
...
Рейтинг: 0 / 0
16.12.2021, 09:18
    #40120491
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity merge
-=Koba=-,
Иерархию поканаблюдаю всего два уровня человек - > книги
...
Рейтинг: 0 / 0
16.12.2021, 09:21
    #40120492
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity merge
-=Koba=-,
При рест у тебя API
addBook(id, person)
delBook(id, person)
updateBook(
Причем, класс персон можно не слать. При желании.
Ты вероятно пытаешься сделать метод
возьмуЧтоУгодно(барахло)
...
Рейтинг: 0 / 0
16.12.2021, 10:00
    #40120499
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity merge
вся проблема в том, что отталкивается от кода, а не от структуры данных.
если б нарисовал на бумажке все связи меж таблиц - не было б вопросов
...
Рейтинг: 0 / 0
16.12.2021, 10:22
    #40120509
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity merge
вадя,
Увы. Молодое поколение уже не исправить.
С другой стороны тут случай детский - Персона и его книги)))
...
Рейтинг: 0 / 0
16.12.2021, 10:27
    #40120512
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity merge
Код: java
1.
2.
3.
GET 	/device-management/devices/{id}   : Get the device information identified by "id"
PUT 	/device-management/devices/{id}   : Update the device information identified by "id"
DELETE	/device-management/devices/{id}   : Delete device by "id"
...
Рейтинг: 0 / 0
16.12.2021, 10:41
    #40120521
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity merge
вадя,
Кстати, я и в бд MERGE редко использовал. Достаточно специфическая команда.
...
Рейтинг: 0 / 0
17.12.2021, 08:49
    #40120899
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity merge
На фронте открывает форма редактировать
Добавляются все новые поля и отправляется все одним махом

Книги , машины, данные персоны итд...
...
Рейтинг: 0 / 0
17.12.2021, 08:50
    #40120900
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity merge
PetroNotC Sharp,

Под merge я имел в виду смержить два листа в ручную, если нет чего из коробки
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Entity merge / 25 сообщений из 63, страница 1 из 3
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]