Hibernate-reactive: session.remove && session.getReference

Созданный на 7 сент. 2020  ·  3Комментарии  ·  Источник: hibernate/hibernate-reactive

Здравствуйте, насколько я понимаю, после jpa есть только один способ удалить отсоединенный объект:

factory.withTransaction((session, transaction) -> 
    session.merge(sampleEntity).invokeUni(session::remove)
).await().indefinitely();

Все в порядке, но если речь идет о производительности, операция слияния занимает много времени и может вызвать реальные проблемы с производительностью. Например, согласно моим неточным измерениям времени, удаление 5000 объектов занимает ~ 4 секунды, в спящем режиме - 50 мс.

Я только что прочитал о новом методе под названием session.getReference который возвращает постоянный экземпляр данной сущности. Можно ли разрешить его использование за session.remove ?

Все 3 Комментарий

Я только что прочитал о новом методе под названием session.getReference который возвращает постоянный экземпляр данной сущности. Можно ли разрешить его использование за session.remove ?

Ах, хороший момент, безусловно, вы должны уметь это делать. Я заставил это работать в # 360.

Однако я хочу, чтобы вы понимали, что нет способа remove() объект, не получив его предварительно. Это потому, что remove() имеет семантику, такую ​​как каскадное удаление и удаление коллекции, которые зависят от состояния объекта в сеансе.

Если вам абсолютно необходимо иметь возможность удалить объект, не извлекая его, вы должны использовать StatelessSession.delete() или запрос HQL delete .

@ Xset-s PS спасибо, что сообщили об этом, это была большая оплошность с моей стороны

Нет проблем, спасибо за подробный ответ об операции удаления и за очень быстрое исправление. Прямо сейчас я провожу эксперименты и переписываю свое серверное приложение, используя вашу новую замечательную библиотеку, поэтому мне легко обнаружить некоторые хитрые проблемы, которые можно было бы зафиксировать только так (или используя большое количество тестов 😄)

Была ли эта страница полезной?
0 / 5 - 0 рейтинги