|
|
|
Нестандартное сохранение сущности в 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 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
slippery, - DTO - это копия объекта ВНЕ хибера. Либо он есть, ЛИБО ты отсоединяешь от хибера объект. - VO и DTO и DAO можно совместить путём добавления в каждый класс TempID - Business layer-ВкладкаСохранитьDTO() это просто бизнес-метод самого верхнего уровня. У тебя без него невозможно. иначе лапша. поэтому твой вопрос ниже непонятен авторПоэтому нужен какой-то другой способ решения. способ1 - убрать везде аннотацию генерате способ2 - добавить поле TempID способ3 - добавить поле SessionID_and_TempTransaction до общей кнопки ОК минусы всех - крах целостности БД при одновременной многопользовательской работе (~100 запр.\сек.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 14:49:44 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
Да бредос полный. Даже писать ответ не хочется - до того все криво. Нельзя менять айдишники в БД, на то он и ID. Нельзя менять айдишники в Хибере, так как вы рискуете порушить кеш первого уровня, в недрах которого хранится сопоставление айдишников и соответствующей сущности. Это все от лукавого. Нужны VO со своими айдишниками и соответствующие им ентити со сгенерированными айдишниками. В противном случае получается полный трешак. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 15:02:24 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 15:21:40 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
svenom, почему трешак, я не хочу ничего менять не в базе, не в хибере, если я дергаю сиквенс руками и получаю ID из базы, подставляю его в сущность и сохраняю. то все окей, правильно же, все верно и никаких нарушений!. единственное, что мешает так это аннотация @GeneratedValue. если ее убрать то все было бы по правильному в данном варианте. мне тут знакомые сказали что можно как-то либо отключить эту аннотацию для сессии, либо не учитывать в определенном случаи, но говорят, что в упор не помнят где такое видели. Вот я и спросил может кто знает хоть в сторону чего посмотреть и попробовать так сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 15:29:23 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 15:36:12 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
slippery, там есть scope идентичности объектов в пределах сессии. Хибер гарантирует, что по АДРЕСУ 2 объекта одинаковы так-же, как и по ID в СУБД. В СУБД нету адресов. Влезать в это механизм - оверхед. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 15:36:47 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
Petro123slippery, там есть scope идентичности объектов в пределах сессии. Хибер гарантирует, что по АДРЕСУ 2 объекта одинаковы так-же, как и по ID в СУБД. В СУБД нету адресов. Влезать в это механизм - оверхед. да я и не хочу влезать, просто мне сказали что можно сделать так чтоб не произошла генерация ИД, в остальном то верно же, разве нет. Какая разница, ну дерну я секвенц отдельным запросом, то что база отдаст вставлю как ИД объекта и сохраню. помоему нормальная схема, не вижу ничего в ней нарушающего. Если только знать как можно отключить этот @GeneratedValue для сущности в рантайме ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 15:52:21 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
slippery, пусть этим сервер занимается. "Сделай настолько просто, насколько это возможно, но не проще". © А. Эйнштейн. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 16:02:42 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
slipperyPetro123slippery, там есть scope идентичности объектов в пределах сессии. Хибер гарантирует, что по АДРЕСУ 2 объекта одинаковы так-же, как и по ID в СУБД. В СУБД нету адресов. Влезать в это механизм - оверхед. да я и не хочу влезать, просто мне сказали что можно сделать так чтоб не произошла генерация ИД, в остальном то верно же, разве нет. Какая разница, ну дерну я секвенц отдельным запросом, то что база отдаст вставлю как ИД объекта и сохраню. помоему нормальная схема, не вижу ничего в ней нарушающего. Если только знать как можно отключить этот @GeneratedValue для сущности в рантаймеСкорее всего можно заэкстендиться от какого-нибудь класса и переопределить поведение генератора. Погуглите по словам "hibernate GeneratedValue turn off". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 16:17:45 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
svenom, - не ты ли говорил, что состояние - не проблема хибера - зачем переопределять, если он используется только при INSERT новой записи. Пусть не делает инсерт, и не понадобится генератор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 16:26:57 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
Petro123svenom, - не ты ли говорил, что состояние - не проблема хибера - зачем переопределять, если он используется только при INSERT новой записи. Пусть не делает инсерт, и не понадобится генератор. дело в том что если я не сделаю инсерт, то объект не попадет в выборку, в примере что я приводил в начале поста это сразу видно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 16:34:42 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
Да не все так страшно, на самом деле тут надо сделать кастомный генератор айди, который в случае если айди указан - сохранйет под этим айди, если не указан - генерит новый что-то вроде этого, Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Вот для дальнейшего изучения - http://stackoverflow.com/questions/5390656/manually-assign-value-to-a-hibernate-uuid https://forum.hibernate.org/viewtopic.php?p=2420327 https://community.jboss.org/wiki/CustomSequences ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 16:43:35 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
slipperyPetro123svenom, - не ты ли говорил, что состояние - не проблема хибера - зачем переопределять, если он используется только при INSERT новой записи. Пусть не делает инсерт, и не понадобится генератор. дело в том что если я не сделаю инсерт, то объект не попадет в выборку, в примере что я приводил в начале поста это сразу видно ну и дальше? - сделал инсерт, id=15 - запрос - откатил - след инсерт уже будет id=85 НИЧЕГО СТРАШНОГО. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 16:45:41 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
забыл никсохранйет под этим айди, вопрос - зачем сохранять под этим id. И какой запрос пойдёт в БД? - INSERT? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 16:48:32 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
у меня был один начальник, очень не любил дырки\пропуски в id. Это оттуда? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 16:50:44 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
авторвопрос - зачем сохранять под этим id. И какой запрос пойдёт в БД? - INSERT? Пойдет конечно же инсерт. Варианта 2, когда бы это могло быть необходимо, возможно есть еще. 1) У тебя был юзер айди = 5, ты его удалил(забанил) и т.п. Потом что-то случилось и тебе нужно восстановить именно с этим айди, ну не знаю, допустим логика завязана на айди, допустим если айди меньше 100, то это модератор, конечно лучше на айди вообще не завязываться, но вот такое бывает. 2) В рамках одной бизнес транзакции, ты создал юзера, создал ему коллекцию ченить и тп., и тебе нужен ключ, ну тоже не самый правильный вариант, но ситуация реальная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 17:03:08 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
забыл ники тебе нужно восстановить именно с этим айди, ТАК НЕ БЫВАЕТ НИ В ОДНОЙ СИСТЕМЕ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 17:05:51 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
придумываем себе геморрой на смех СУБДшникам КАК БЫ УДАЛЯЕМ записи. Понарошку. Чтобы запрос сделать. Они скоро ржать будут прочитав. лучше рассмотреть такой ВИ: Клиент-злостный неплательщик id=75 - редактируем - удаляем клиента и каскадом все заказы - flush() - удалили из БД с кодом id=75 - запросы чтобы ЭТО увидеть - откат - восстановили id=75 со всеми заказами - думаем дальше в длинной транзакции что с ним делать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 17:07:34 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
забыл никавторвопрос - зачем сохранять под этим id. И какой запрос пойдёт в БД? - INSERT? Пойдет конечно же инсерт. Варианта 2, когда бы это могло быть необходимо, возможно есть еще. 1) У тебя был юзер айди = 5, ты его удалил(забанил) и т.п. Потом что-то случилось и тебе нужно восстановить именно с этим айди, ну не знаю, допустим логика завязана на айди, допустим если айди меньше 100, то это модератор, конечно лучше на айди вообще не завязываться, но вот такое бывает. 2) В рамках одной бизнес транзакции, ты создал юзера, создал ему коллекцию ченить и тп., и тебе нужен ключ, ну тоже не самый правильный вариант, но ситуация реальная. да у меня именно второй вариант) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 17:08:04 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
забыл ник, реальная ситуация - я привёл. Метод №5. Наверняка, визарды так делают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 17:09:09 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
авторТАК НЕ БЫВАЕТ НИ В ОДНОЙ СИСТЕМЕ Громкое заявление:) Вы еще многого не видели, я соглашусь что так не бывает в ГРАМОТНО СПРОЕКТИРОВАННОЙ системе, в которой бизнес логика никак не зависит от айди. Так что 1) Бывают криво спроектированные приложения и 2)Унаследованные приложения 3) Приложения с бизнес-ключом, типа email Лично я конечно не приемлю таких действий, но уж коли понадобилось - то нужно писать кастомный генератор айди. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 17:09:27 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
забыл ник, эт согласен :) Программист может всё. Даже id сортировку. Один чел был не доволен, что его ФИО на "Я" всё время было последним в списках. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 17:13:48 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
Petro123забыл ник, реальная ситуация - я привёл. Метод №5. Наверняка, визарды так делают. возможно, но мне то не вариант в этом варианте нельзя юзать хибернате, ну да ладно насчет хиберната, там же надо руками писать вставку и удаление вставки, держать видимо зафиксирован объект или нет и от какой сессии(в моем случая пользователь может открыть несколько карточек в 1 сесии, так что пользователь + сессия + карточка), писать с учетом этого запросы на выборки ну и т.д. Разве я не прав? Это проще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 17:22:54 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
slipperyPetro123забыл ник, реальная ситуация - я привёл. Метод №5. Наверняка, визарды так делают. возможно, но мне то не вариант в этом варианте нельзя юзать хибернате, ну да ладно насчет хиберната, там же надо руками писать вставку и удаление вставки, держать видимо зафиксирован объект или нет и от какой сессии(в моем случая пользователь может открыть несколько карточек в 1 сесии, так что пользователь + сессия + карточка), писать с учетом этого запросы на выборки ну и т.д. Разве я не прав? Это проще? так у меня задача на это не заканчивается след шаг, это прикрутка версионности с возможностью отката. Я надеюсь что тот же Envers заработает автоматом, а в 5 варианте это все руками писать надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 17:26:37 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
slippery, - во все запросы надо фильтр прописать where field = idSession - вставка и удаление КАК ОБЫЧНО и сразу в БД - что значит несколько карточек при ОДНОЙ СЕССИИ HTTP? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 17:42:54 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
slippery, Карточка Петров и карточка Иванов это 2 строки в БД или 2 экземпляра класса с флагами IdSession ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2012, 17:45:21 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
Petro123slippery, Карточка Петров и карточка Иванов это 2 строки в БД или 2 экземпляра класса с флагами IdSession карточкой я назвал каркас(мастер, визард) для работы с объектами к примеру "пользователь", в разных закладках браузера, клиент может открыть на редактирование и петрова и иванова. Получается, что каркас является что-то типа сессионным объектом. создается этот каркас наследованнием от определенного класса. и висит себе в памяти, все кнопки и прочие элементы управления на этом каркасе при нажатии посылают конкретному экземпляру каркаса события. Поэтому если атрибутом каркаса при его создании сделать к примеру ссылку на сервис, то в обработчике событий от кнопок не надо снова получать сервис, а достаточно обратится по ссылке которую хранит каркас. В сессии пользователя(после его авторизации) в разных вкладках, он может открывать разнобразные карточки(каркасы) разных объектов системы. Это реально удобно при редактировании или еще чего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 00:23:33 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
это как бы форма и ее контроллер, создается форма, создается контроллер, контроллер висит в памяти , форма посылает контроллеру аяксом запросы которые он обрабатывает. На каждую форму свой контроллер. Визард в моем случаи это отдельная форма со своим контроллером(каркасом), в форме визарда есть несколько кнопок и элемент таббокс. таббокс имеет закладки. каждая закладка это уже другая форма с ее контроллером. Это стандартная схема работы зкосс. Ну это как сделано просто рассказал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 00:27:25 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
Вопрос про генератор, что-то я так и не понял как мой генератор подцепить теперь к сущностям, как хибернат на него настроить или указать чтоб он этот класс взял вместо стандартного? Должен же быть способ если не править исходники хиберната и не добавлять туда свой генератор ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 01:10:08 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
slippery, Все что ты написал это обычный ОПП. Он и так работает без твоего ТЗ. Простой вопрос. Завел Петрова во второй вкладке. В первой его нужно видеть? Если да. То ты его увидишь по ид сессии.:) меня удивляет когда люди не видят простого решения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 07:35:28 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
Petro123slippery, Все что ты написал это обычный ОПП. Он и так работает без твоего ТЗ. Простой вопрос. Завел Петрова во второй вкладке. В первой его нужно видеть? Если да. То ты его увидишь по ид сессии.:) меня удивляет когда люди не видят простого решения. можно и id сессии сделать и сохранять "временные" объекты, но тогда: 1) надо добавлять 2 условия во все выборки sessionId is null or sessionId = <переданный параметр в запросы из карточки> 2) во все запросы просто системы надо добавлять условие sessionId is null 3) так как уже посмотрел Envers а он по коммите генерит новую ревизию, то надо также делать и ревизию "временной" 4) писать сборщик муссора на временные объекты в системе и на временные ревизии(если делать через Envers) я бы не сказал что это простое решение...... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 13:13:31 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
да если использовать Envers, то так как он не понимает что такое "временная" ревизия, то либо его не использовать, либо влезать в его код и добавлять те же условия при выборки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 13:15:17 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
ну и последнее, а как же "грязное чтения" если мы во вкладке 2 изменили Петрову инфу, во вкладке 1 должны это видеть Но другие пользователи, не должны видеть, что Петрову изменили инфу. То есть все равно механизм держать изменения в памяти сбрасывать перед выполнением запроса и откатывать остается прежним. По моему тогда в этом механизме и логично сделать примерно то что я и собираюсь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 13:25:49 |
|
||
|
Нестандартное сохранение сущности в hibernate
|
|||
|---|---|---|---|
|
#18+
slipperyя бы не сказал что это простое решение...... дык ты всё критикуешь 5-ое и ничего не ответил на прямо поставленный вопрос по 3-му. Мне нравятся такие программисты. Будут писать и усложнять в ТЗ только для своего удовольствия. - Откуда взялся вопрос последних 2-х страниц про смену ID и "вкладках"? В первом ТЗ этого не было. Там было: Длинная Правящая бизнес-транзакция на сессию. Техническая часть: - разницу в модальном и немодальном окне понимаешь? Если ты решил сделать НЕСКОЛЬКО ДЛИННЫХ транзакции БЕЗ поддержки хибером, то ты будешь руками делать все их атрибуты (атомарность\повторяемость\изоляция). Т.е. в любом варианте будет геморрой - ставь мьютексы\семафоры\хачь Хибер и т.д. БЛ-ГУИ часть: - что будет, если сделать вместо модального окна "Перевод счёта" - не модальное или вкладки? Правильно - тебя посадят на счётчик, пока не исправишь. Зачем польз-лю в 3-4 вкладках запускать Длинные Правящие транзакции и уходить на обед? ЗЫ Через неделю ты придёшь с вопросом - почему банковский счёт перепрыгнул в session.SaveOrUpdate Удачи! ______________________________________________ "Сложнее всего в мире достигнуть простоты — это крайняя граница опыта и последнее усилие гения". © George Sand. AutoPOI.ru — ГИС-технологии для Oracle ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 14:26:26 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2132727]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
79ms |
get tp. blocked users: |
2ms |
| others: | 329ms |
| total: | 504ms |

| 0 / 0 |
