|
|
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
Добрый вечер. Есть сущность @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 не меняя аннотаций которые проставлены и как это сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 01:54:35 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
Речь идет о записи под конкретным id или перезапись конкретной сущности (по id)? Если первое, то изначально неправильно - идентефикатор подменяешь другим понятием. Так нельзя (точнее, может и можно, но неправильно). Если же второе (банальный Update), но это стандартная процедура: сначала надо получить сущность по id типа такого Main main = session.get(Main.class, id); потом внести изменения и записать. Кстати, часто записывать через save не получается, везде пользуюсь merge. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 03:04:20 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
IDVsbruckРечь идет о записи под конкретным id или перезапись конкретной сущности (по id)? Если первое, то изначально неправильно - идентефикатор подменяешь другим понятием. Так нельзя (точнее, может и можно, но неправильно). Если же второе (банальный Update), но это стандартная процедура: сначала надо получить сущность по id типа такого Main main = session.get(Main.class, id); потом внести изменения и записать. Кстати, часто записывать через save не получается, везде пользуюсь merge. я имел ввиду первый вариант, и я понимаю почему вы говорите что это неправильно, но в данном моем случаи мне так надо, поэтмоу я и спрашиваю как так можно сделать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 03:10:59 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
slippery, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 07:32:34 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
Найди другое решени или напрямую в бд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 07:36:31 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
Аргумент "мне так надо" не катит, это не аргумент вовсе. РАсскажите зачем вам это надо, наверняка есть человеческие пути решения вашей проблемы. Если действительно без этого никак, то убирайте @GeneratedValue и вставляйте значения ключа руками пот создании сущности. Иными словами - либо вы генерируете ключи только автоматически, либо только руками. Третьего не дано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 08:44:15 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
ну, и если твой шеф второй раз ставит неадекватную задачу (после автовкладок) - беги без оглядки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 09:11:11 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
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. Но я не могу убрать автогенерацию , так как сущность создается не только в моей задачи. А и другими людьми. А так как у меня как вы помните универсальный визард, то это касается вообще всех сущностей Есть какие-нибудь у кого мысли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 10:34:14 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
slippery, может ты тут городишь Монстра, а заказчик с ходу упростит решение по 1 варианту (blazkowicz) 11915510 . Не говорил с ним? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 10:38:49 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
slippery, объекты в корзине отсоединены от хибера. После редактирования ты делаешь UPDATE. В чём проблема? Т.е. CRUD с новым ид для новых и update для старых. ______________________________________________ "Сделай настолько просто, насколько это возможно, но не проще". © А. Эйнштейн. AutoPOI.ru — ГИС-технологии для Oracle ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 10:42:21 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
Petro123, этот вариант вроде всем подходит, за исключением вот это проблемы, а не мог бы ты подсказать 1 вариант о котором ты говоришь, что-то не могу найти или понять какой из них первый? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 10:47:38 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
Petro123slippery, объекты в корзине отсоединены от хибера. После редактирования ты делаешь UPDATE. В чём проблема? Т.е. CRUD с новым ид для новых и update для старых. ______________________________________________ "Сделай настолько просто, насколько это возможно, но не проще". © А. Эйнштейн. AutoPOI.ru — ГИС-технологии для Oracle ups действительно, при методе "корзина-запросы" действительно проблема с ID. СУБД молодец. При откате id будут выданы новые. Поговори с заказчиком! Задачу можно решить, но дорого и долго (на сосед форуме предложили не корзину, а таблицы рядом в БД) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 10:49:14 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
slipperyPetro123, что-то не могу найти или понять какой из них первый? первый - упростить ТЗ (редактировать ОДНУ сущность) 11965940 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 10:53:57 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
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. Соответственно, на следующей транзакции вы прогоняете процесс по новой, получаете новые идентификаторы. Все, никакой проблемы нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 11:05:45 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
svenom, у него нет JVM. У него есть корзина-сессияHTTP и хибер с 1 кэшем. Лично я не понял твоей фразы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 11:10:37 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
[quot svenom]slipperyпропущено... Как должен работать ваш подход: 1. Начали транзакцию 2. Применили все изменения в правильной последовательности 3. Выполнили чтение 4. Закрыли (откатили) транзакцию. Так вот, внимание на шаг 2 - здесь ни в коем случае нельзя никуда в JVM сохранять сущности со сгенерированными идентификаторами , по факту закрытия транзакции они должны быть отданы на растерзание GC. Соответственно, на следующей транзакции вы прогоняете процесс по новой, получаете новые идентификаторы. Все, никакой проблемы нет. подождите, я и изначально не хотел сохранять, но столкнулся с проблемой: в данном примере, что вы приводите в пункте 3. будет примерно так: List<User> users = findNewUser(....) в список users вернется вновь созданный объект "User(5)" с идентификатором. а далее мне уже в новом запросе(по нажатию новой кнопки) этот список(а с его данными могли провести манипуляции какие-то, поэтому он сохранялся в переменную и его результат держится между запросами, это стандартный в зкоссе прием всего лишь сделать его атрибутом контроллера и все и он между запросами держится) нужно добавить к роли role.setUsers(users) update(role) и как раз вся фишка в том о чем мы и говорили, что мне не нужно вынимать из "собственной сессии" новые объекты по каким-то принципам, вся задумка была в том что эти объекты должны выниматься запросами hql над ними проводится манипуляция и выдается результат на экран ,а по следующей кнопки этот результат можно куда-то добавить,как в примере этот список пользователей добавляется к роли ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 11:21:36 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
Petro123, у меня и сессии то нет) как и предполагалась сессия хибера открывается и закрывается в начале-конце запроса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 11:23:03 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
slipperyPetro123, у меня и сессии то нет) как и предполагалась сессия хибера открывается и закрывается в начале-конце запроса сессия HTTP<>сессияХибера. Зачем они одинаково назвали мне не понять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 11:24:44 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
svenom, role = findRole(...) List<User> users = findNewUser(....) role.setUsers(users) update(role) как в этой стратегии будет работать этот код??? Разве не возникнет та проблема что я описал выше? А ведь вся суть в том что бы можно было писать такой код, который будет выполняться по нажатию кнопки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 11:28:55 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
slippery, код приведенный ниже это 1 запрос то есть 1. Начали транзакцию 2. Применили все изменения в правильной последовательности 3 Выполнили чтение: List<User> users = findNewUser(....) 4. Результат чтения сохранили : role.setUsers(users) ; update(role) - поместили роль в очередь операций по обновлению 5. Закрыли (откатили) транзакцию. разве не возникнет проблемы что я описал, или я чего-то не догоняю совсем??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 11:33:09 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
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. Наконец, используя подобные маппинги внутренних идентификаторов на иднтификаторы, полученные из БД, вы производите все необходимые действия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 12:08:54 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
Код: java 1. а как завязать EmployeeVO(1, Vasia) на Adress(???, "г.Курск") который не новый, а есть в БД? Код: java 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 12:30:54 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
по факту, это merge 2-х СУБД со связями если вкладок много в динамике, как хочет заказчик. Репликация Мастер-Мастер со всеми их коллизиями. "Закат солнца вручную" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 12:34:20 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
аффтар! Ты говорил, что твоя задача - обвязка контейнер вкладок. Остальное пишут программисты. Вот пусть они и напишут Код: java 1. 2. а ты им просто поле добавь TempID и всё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 12:43:27 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
хм, создавать VO или DTO мне не вариант вкладок уже 10 написано(причем они там сложные и большие по коду) и никто переписывать логику на обвязки не будет, там все работают с сущностями напрямую, дергают их лази поля и т.д. и т.п. такая архитектура была и задумка с самого начала. Это мне уже не поправить. Поэтому нужен какой-то другой способ решения...а нельзя ли как-нибудь динамически @GeneratedValue отключать? у меня в проекте сквозная идентификация и все сущности наследуются от 1 в которой и стоит @GeneratedValue, если его можно динамически вырубить для определенной сесси(я то знаю через какую сессию сохраняют), предварительно получив id для сущности, то это тоже решит проблему как мне кажется. Может кто знает о таком? Ну или какие минусы в таком варианте? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 14:21:26 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37630332&tid=2132727]: |
0ms |
get settings: |
18ms |
get forum list: |
24ms |
check forum access: |
8ms |
check topic access: |
8ms |
track hit: |
72ms |
get topic data: |
18ms |
get forum data: |
4ms |
get page messages: |
95ms |
get tp. blocked users: |
2ms |
| others: | 360ms |
| total: | 609ms |

| 0 / 0 |
