powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Нестандартное сохранение сущности в hibernate
25 сообщений из 59, страница 1 из 3
Нестандартное сохранение сущности в hibernate
    #37630008
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер. Есть сущность

@Entity
public class Main {

@Id
@GeneratedValue
private Long id;

@Column
private String name;



и ее сохранения происходит в системе через session.save . И все прекрасно работает, ей автоматически при сохранении выдается идентификатор. Но возникла ситуация, когда я знаю конкретный идентифкатор(не занятый в таблице) и мне надо сохранить эту сущность именно с этим id. Что-то типа этого:

Main main = new Main();
main.setId(1L);
main.setName("test");
session.save(main)


Естественно это не работает, объекту выдается новый id и сущность сохраняется с уже новым id, то же самое если делать merge , а saveOrUpdate выдал ошибку, что попытались сменить id. Вопрос: можно ли сохранить данную сущность под указанным id средствами hibernate не меняя аннотаций которые проставлены и как это сделать?
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37630033
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Речь идет о записи под конкретным id или перезапись конкретной сущности (по id)?
Если первое, то изначально неправильно - идентефикатор подменяешь другим понятием. Так нельзя (точнее, может и можно, но неправильно).
Если же второе (банальный Update), но это стандартная процедура: сначала надо получить сущность по id типа такого
Main main = session.get(Main.class, id);
потом внести изменения и записать.
Кстати, часто записывать через save не получается, везде пользуюсь merge.
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37630038
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IDVsbruckРечь идет о записи под конкретным id или перезапись конкретной сущности (по id)?
Если первое, то изначально неправильно - идентефикатор подменяешь другим понятием. Так нельзя (точнее, может и можно, но неправильно).
Если же второе (банальный Update), но это стандартная процедура: сначала надо получить сущность по id типа такого
Main main = session.get(Main.class, id);
потом внести изменения и записать.
Кстати, часто записывать через save не получается, везде пользуюсь merge.

я имел ввиду первый вариант, и я понимаю почему вы говорите что это неправильно, но в данном моем случаи мне так надо, поэтмоу я и спрашиваю как так можно сделать
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37630088
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slippery,
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37630090
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Найди другое решени или напрямую в бд.
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37630111
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аргумент "мне так надо" не катит, это не аргумент вовсе. РАсскажите зачем вам это надо, наверняка есть человеческие пути решения вашей проблемы. Если действительно без этого никак, то убирайте @GeneratedValue и вставляйте значения ключа руками пот создании сущности. Иными словами - либо вы генерируете ключи только автоматически, либо только руками. Третьего не дано.
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37630135
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну, и если твой шеф второй раз ставит неадекватную задачу (после автовкладок) - беги без оглядки.
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37630210
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123ну, и если твой шеф второй раз ставит неадекватную задачу (после автовкладок) - беги без оглядки.

))) да это все та же задача, только это уже конкретный момент в её решении для меня, думал есть простой ответ и не стал писать туда, так как ответ должен был решить проблему) тогда опишу применимо к той задаче. Ссылка на ту задачу: /topic/909083&hl=

Помните в конце был предложен вариант сбрасывать всю сессию перед каждым запросом в транзакцию и потом проводить откат чтоб изменения не вступали в силу. Ну так вот сущности я храню в отдельной в структуре, как предлагал svenom, перед запросом их сбрасываю провожу запрос и откатываю транзакцию и что происходит: пример теоретический естественно
1 действие: «найти последних 5 новых пользователей»
1.1 начало транзакции
1.2 добавление сущности «Пользователь» ему создается id, так как это сущность то save или merge чтоб добавить.
1.3 выполняется запрос : «найти последних 5 новых пользователей»
в результат запроса попадает наш новый добавленный пользователь с выделенным id = 5
1.4 откат транзакции
1.5 список передается на обработку

2 действие: «включить найденных пользователей в роль 1»
2.1 начало транзакции
2.2 добавление сущности «Пользователь» ему создается новый id отличный от id на шаге 1.3 и не равный 5

2.3 выполняется запрос : «включить найденных пользователей» !!! и вот тут и момент будет попытка включить в роль пользователя который был получен в запросе 1.3 с тем id. Так как результат того списка(1.5) подставляется в ну скажем так метод "включения пользователя в роль". А не того что создается сейчас на шаге 2.2 А пользователя с тем id = 5 вообще нет в системе, что естественно

Вот я и подумал выделать под сущности при сбросе собственной сессии id и потом перед каждым запросом вставлять их уже под этим id. Но я не могу убрать автогенерацию , так как сущность создается не только в моей задачи. А и другими людьми. А так как у меня как вы помните универсальный визард, то это касается вообще всех сущностей Есть какие-нибудь у кого мысли?
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37630220
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slippery,
может ты тут городишь Монстра, а заказчик с ходу упростит решение по 1 варианту (blazkowicz) 11915510 .
Не говорил с ним?
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37630226
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slippery,
объекты в корзине отсоединены от хибера. После редактирования ты делаешь UPDATE. В чём проблема?
Т.е. CRUD с новым ид для новых и update для старых.
______________________________________________
"Сделай настолько просто, насколько это возможно, но не проще". © А. Эйнштейн.
AutoPOI.ru — ГИС-технологии для Oracle
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37630236
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

этот вариант вроде всем подходит, за исключением вот это проблемы, а не мог бы ты подсказать 1 вариант о котором ты говоришь, что-то не могу найти или понять какой из них первый?
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37630239
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123slippery,
объекты в корзине отсоединены от хибера. После редактирования ты делаешь UPDATE. В чём проблема?
Т.е. CRUD с новым ид для новых и update для старых.
______________________________________________
"Сделай настолько просто, насколько это возможно, но не проще". © А. Эйнштейн.
AutoPOI.ru — ГИС-технологии для Oracle

ups
действительно, при методе "корзина-запросы" действительно проблема с ID.
СУБД молодец. При откате id будут выданы новые.
Поговори с заказчиком!
Задачу можно решить, но дорого и долго (на сосед форуме предложили не корзину, а таблицы рядом в БД)
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37630247
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slipperyPetro123,
что-то не могу найти или понять какой из них первый?
первый - упростить ТЗ (редактировать ОДНУ сущность)
11965940
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37630275
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slipperyPetro123ну, и если твой шеф второй раз ставит неадекватную задачу (после автовкладок) - беги без оглядки.

))) да это все та же задача, только это уже конкретный момент в её решении для меня, думал есть простой ответ и не стал писать туда, так как ответ должен был решить проблему) тогда опишу применимо к той задаче. Ссылка на ту задачу: /topic/909083&hl=

Помните в конце был предложен вариант сбрасывать всю сессию перед каждым запросом в транзакцию и потом проводить откат чтоб изменения не вступали в силу. Ну так вот сущности я храню в отдельной в структуре, как предлагал svenom, перед запросом их сбрасываю провожу запрос и откатываю транзакцию и что происходит: пример теоретический естественно
1 действие: «найти последних 5 новых пользователей»
1.1 начало транзакции
1.2 добавление сущности «Пользователь» ему создается id, так как это сущность то save или merge чтоб добавить.
1.3 выполняется запрос : «найти последних 5 новых пользователей»
в результат запроса попадает наш новый добавленный пользователь с выделенным id = 5
1.4 откат транзакции
1.5 список передается на обработку

2 действие: «включить найденных пользователей в роль 1»
2.1 начало транзакции
2.2 добавление сущности «Пользователь» ему создается новый id отличный от id на шаге 1.3 и не равный 5

2.3 выполняется запрос : «включить найденных пользователей» !!! и вот тут и момент будет попытка включить в роль пользователя который был получен в запросе 1.3 с тем id. Так как результат того списка(1.5) подставляется в ну скажем так метод "включения пользователя в роль". А не того что создается сейчас на шаге 2.2 А пользователя с тем id = 5 вообще нет в системе, что естественно

Вот я и подумал выделать под сущности при сбросе собственной сессии id и потом перед каждым запросом вставлять их уже под этим id. Но я не могу убрать автогенерацию , так как сущность создается не только в моей задачи. А и другими людьми. А так как у меня как вы помните универсальный визард, то это касается вообще всех сущностей Есть какие-нибудь у кого мысли?Проблема высосана из пальца, ее по сути нет. Как должен работать ваш подход:
1. Начали транзакцию
2. Применили все изменения в правильной последовательности
3. Выполнили чтение
4. Закрыли (откатили) транзакцию.
Так вот, внимание на шаг 2 - здесь ни в коем случае нельзя никуда в JVM сохранять сущности со сгенерированными идентификаторами , по факту закрытия транзакции они должны быть отданы на растерзание GC.
Соответственно, на следующей транзакции вы прогоняете процесс по новой, получаете новые идентификаторы. Все, никакой проблемы нет.
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37630287
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svenom,
у него нет JVM.
У него есть корзина-сессияHTTP и хибер с 1 кэшем.
Лично я не понял твоей фразы.
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37630323
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot svenom]slipperyпропущено...
Как должен работать ваш подход:
1. Начали транзакцию
2. Применили все изменения в правильной последовательности
3. Выполнили чтение
4. Закрыли (откатили) транзакцию.
Так вот, внимание на шаг 2 - здесь ни в коем случае нельзя никуда в JVM сохранять сущности со сгенерированными идентификаторами , по факту закрытия транзакции они должны быть отданы на растерзание GC.
Соответственно, на следующей транзакции вы прогоняете процесс по новой, получаете новые идентификаторы. Все, никакой проблемы нет.

подождите, я и изначально не хотел сохранять, но столкнулся с проблемой: в данном примере, что вы приводите в пункте 3. будет примерно так:

List<User> users = findNewUser(....)
в список users вернется вновь созданный объект "User(5)" с идентификатором.
а далее мне уже в новом запросе(по нажатию новой кнопки) этот список(а с его данными могли провести манипуляции какие-то, поэтому он сохранялся в переменную и его результат держится между запросами, это стандартный в зкоссе прием всего лишь сделать его атрибутом контроллера и все и он между запросами держится) нужно добавить к роли
role.setUsers(users)
update(role)

и как раз вся фишка в том о чем мы и говорили, что мне не нужно вынимать из "собственной сессии" новые объекты по каким-то принципам, вся задумка была в том что эти объекты должны выниматься запросами hql над ними проводится манипуляция и выдается результат на экран ,а по следующей кнопки этот результат можно куда-то добавить,как в примере этот список пользователей добавляется к роли
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37630329
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

у меня и сессии то нет) как и предполагалась сессия хибера открывается и закрывается в начале-конце запроса
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37630332
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slipperyPetro123,

у меня и сессии то нет) как и предполагалась сессия хибера открывается и закрывается в начале-конце запроса
сессия HTTP<>сессияХибера.
Зачем они одинаково назвали мне не понять.
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37630341
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
svenom,

role = findRole(...)
List<User> users = findNewUser(....)
role.setUsers(users)
update(role)

как в этой стратегии будет работать этот код??? Разве не возникнет та проблема что я описал выше? А ведь вся суть в том что бы можно было писать такой код, который будет выполняться по нажатию кнопки
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37630357
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
slippery, код приведенный ниже это 1 запрос
то есть
1. Начали транзакцию
2. Применили все изменения в правильной последовательности
3 Выполнили чтение: List<User> users = findNewUser(....)
4. Результат чтения сохранили : role.setUsers(users) ; update(role) - поместили роль в очередь операций по обновлению
5. Закрыли (откатили) транзакцию.

разве не возникнет проблемы что я описал, или я чего-то не догоняю совсем???
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37630424
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slippery,
Ну вот вам пример, как это должно работать. Допустим, у нас есть сущности Employee(id, name) и Department(id, name). Вы хотите создать нового сотрудника Васю, прикрепить его к департаменту и суметь получить его в выборке по департаменту на следующем запросе. Как это сделать?
1. Создаем EmployeeVO, которому присваиваем имя Вася и какой-то собственный идентификатор (а не сгенерированный базой!). Поулчаем EmployeeVO(1, Vasia).
2. Добавляем его в список сотрудников департамента DepratmentVO.getEmployees();
3. Сохраняем эти VO в сессии.
4. Когда начинается новая транзакция, вы берете те VO, что должны быть сохранены в базе, перегоняете их в соответствующие сущности, сохраняете в базе, а потом сопоставляете идентификаторы VO и Entity. Т.е., что бы была связка, например:
EmployeeVO(1, Vasia) -> Employee(34, Vasia)
5. Наконец, используя подобные маппинги внутренних идентификаторов на иднтификаторы, полученные из БД, вы производите все необходимые действия.
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37630470
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
[quote svenom]EmployeeVO(1, Vasia) -> Employee(34, Vasia)[/quote]


а как завязать EmployeeVO(1, Vasia) на Adress(???, "г.Курск") который не новый, а есть в БД?
Код: java
1.
2.
3.
4.
Заказы()
Заказчик()
Адрес()
СобакаЗаказчика()
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37630473
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по факту, это merge 2-х СУБД со связями если вкладок много в динамике, как хочет заказчик.
Репликация Мастер-Мастер со всеми их коллизиями.
"Закат солнца вручную"
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37630496
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
аффтар!
Ты говорил, что твоя задача - обвязка контейнер вкладок. Остальное пишут программисты.
Вот пусть они и напишут
Код: java
1.
2.
Business layer-ВкладкаПерезапросViewModel()
Business layer-ВкладкаСохранитьDTO()


а ты им просто поле добавь TempID и всё.
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37630777
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
хм, создавать VO или DTO мне не вариант вкладок уже 10 написано(причем они там сложные и большие по коду) и никто переписывать логику на обвязки не будет, там все работают с сущностями напрямую, дергают их лази поля и т.д. и т.п. такая архитектура была и задумка с самого начала. Это мне уже не поправить. Поэтому нужен какой-то другой способ решения...а нельзя ли как-нибудь динамически @GeneratedValue отключать?

у меня в проекте сквозная идентификация и все сущности наследуются от 1 в которой и стоит @GeneratedValue, если его можно динамически вырубить для определенной сесси(я то знаю через какую сессию сохраняют), предварительно получив id для сущности, то это тоже решит проблему как мне кажется. Может кто знает о таком? Ну или какие минусы в таком варианте?
...
Рейтинг: 0 / 0
25 сообщений из 59, страница 1 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / Нестандартное сохранение сущности в hibernate
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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