powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Нестандартное сохранение сущности в hibernate
59 сообщений из 59, показаны все 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
Нестандартное сохранение сущности в hibernate
    #37630861
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slippery,
- DTO - это копия объекта ВНЕ хибера. Либо он есть, ЛИБО ты отсоединяешь от хибера объект.
- VO и DTO и DAO можно совместить путём добавления в каждый класс TempID
- Business layer-ВкладкаСохранитьDTO() это просто бизнес-метод самого верхнего уровня. У тебя без него невозможно. иначе лапша.
поэтому твой вопрос ниже непонятен
авторПоэтому нужен какой-то другой способ решения.
способ1
- убрать везде аннотацию генерате
способ2
- добавить поле TempID
способ3
- добавить поле SessionID_and_TempTransaction до общей кнопки ОК

минусы всех - крах целостности БД при одновременной многопользовательской работе (~100 запр.\сек.)
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37630892
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да бредос полный. Даже писать ответ не хочется - до того все криво. Нельзя менять айдишники в БД, на то он и ID. Нельзя менять айдишники в Хибере, так как вы рискуете порушить кеш первого уровня, в недрах которого хранится сопоставление айдишников и соответствующей сущности. Это все от лукавого.
Нужны VO со своими айдишниками и соответствующие им ентити со сгенерированными айдишниками. В противном случае получается полный трешак.
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37630949
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slippery,
5 вариант без DTO тебе подойдёт
11968811
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37630972
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
svenom,

почему трешак, я не хочу ничего менять не в базе, не в хибере, если я дергаю сиквенс руками и получаю ID из базы, подставляю его в сущность и сохраняю. то все окей, правильно же, все верно и никаких нарушений!. единственное, что мешает так это аннотация @GeneratedValue. если ее убрать то все было бы по правильному в данном варианте. мне тут знакомые сказали что можно как-то либо отключить эту аннотацию для сессии, либо не учитывать в определенном случаи, но говорят, что в упор не помнят где такое видели. Вот я и спросил может кто знает хоть в сторону чего посмотреть и попробовать так сделать?
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37630994
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123slippery,
5 вариант без DTO тебе подойдёт
11968811

почитаю сейчас, спасибо
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37630995
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slippery,
там есть scope идентичности объектов в пределах сессии.
Хибер гарантирует, что по АДРЕСУ 2 объекта одинаковы так-же, как и по ID в СУБД.
В СУБД нету адресов.
Влезать в это механизм - оверхед.
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37631040
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123slippery,
там есть scope идентичности объектов в пределах сессии.
Хибер гарантирует, что по АДРЕСУ 2 объекта одинаковы так-же, как и по ID в СУБД.
В СУБД нету адресов.
Влезать в это механизм - оверхед.
да я и не хочу влезать, просто мне сказали что можно сделать так чтоб не произошла генерация ИД, в остальном то верно же, разве нет. Какая разница, ну дерну я секвенц отдельным запросом, то что база отдаст вставлю как ИД объекта и сохраню. помоему нормальная схема, не вижу ничего в ней нарушающего. Если только знать как можно отключить этот @GeneratedValue для сущности в рантайме
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37631076
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slippery,
пусть этим сервер занимается.
"Сделай настолько просто, насколько это возможно, но не проще". © А. Эйнштейн.
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37631113
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slipperyPetro123slippery,
там есть scope идентичности объектов в пределах сессии.
Хибер гарантирует, что по АДРЕСУ 2 объекта одинаковы так-же, как и по ID в СУБД.
В СУБД нету адресов.
Влезать в это механизм - оверхед.
да я и не хочу влезать, просто мне сказали что можно сделать так чтоб не произошла генерация ИД, в остальном то верно же, разве нет. Какая разница, ну дерну я секвенц отдельным запросом, то что база отдаст вставлю как ИД объекта и сохраню. помоему нормальная схема, не вижу ничего в ней нарушающего. Если только знать как можно отключить этот @GeneratedValue для сущности в рантаймеСкорее всего можно заэкстендиться от какого-нибудь класса и переопределить поведение генератора. Погуглите по словам "hibernate GeneratedValue turn off".
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37631144
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svenom,
- не ты ли говорил, что состояние - не проблема хибера
- зачем переопределять, если он используется только при INSERT новой записи. Пусть не делает инсерт, и не понадобится генератор.
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37631176
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123svenom,
- не ты ли говорил, что состояние - не проблема хибера
- зачем переопределять, если он используется только при INSERT новой записи. Пусть не делает инсерт, и не понадобится генератор.

дело в том что если я не сделаю инсерт, то объект не попадет в выборку, в примере что я приводил в начале поста это сразу видно
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37631208
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да не все так страшно, на самом деле тут надо сделать кастомный генератор айди, который в случае если айди указан - сохранйет под этим айди, если не указан - генерит новый
что-то вроде этого,
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
public class FallbackUUIDHexGenerator extends UUIDHexGenerator {
    private String entityName;

    @Override
    public void configure(Type type, Properties params, Dialect d)
            throws MappingException {
        entityName = params.getProperty(ENTITY_NAME);
        super.configure(type, params, d);
    }

    @Override
    public Serializable generate(SessionImplementor session, Object object)
            throws HibernateException {            
        Serializable id = session
            .getEntityPersister(entityName, object)
            .getIdentifier(object, session);       

        if (id == null)
            return super.generate(session, object);
        else
            return id;
    }
}




Вот для дальнейшего изучения -
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
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37631212
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slipperyPetro123svenom,
- не ты ли говорил, что состояние - не проблема хибера
- зачем переопределять, если он используется только при INSERT новой записи. Пусть не делает инсерт, и не понадобится генератор.

дело в том что если я не сделаю инсерт, то объект не попадет в выборку, в примере что я приводил в начале поста это сразу видно
ну и дальше?
- сделал инсерт, id=15
- запрос
- откатил
- след инсерт уже будет id=85
НИЧЕГО СТРАШНОГО.
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37631227
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никсохранйет под этим айди,
вопрос - зачем сохранять под этим id. И какой запрос пойдёт в БД?
- INSERT?
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37631234
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня был один начальник, очень не любил дырки\пропуски в id. Это оттуда?
:)
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37631270
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторвопрос - зачем сохранять под этим id. И какой запрос пойдёт в БД?
- INSERT?
Пойдет конечно же инсерт.
Варианта 2, когда бы это могло быть необходимо, возможно есть еще.

1) У тебя был юзер айди = 5, ты его удалил(забанил) и т.п. Потом что-то случилось и тебе нужно восстановить именно с этим айди, ну не знаю, допустим логика завязана на айди, допустим если айди меньше 100, то это модератор, конечно лучше на айди вообще не завязываться, но вот такое бывает.
2) В рамках одной бизнес транзакции, ты создал юзера, создал ему коллекцию ченить и тп., и тебе нужен ключ, ну тоже не самый правильный вариант, но ситуация реальная.
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37631278
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ники тебе нужно восстановить именно с этим айди,
ТАК НЕ БЫВАЕТ НИ В ОДНОЙ СИСТЕМЕ
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37631283
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
придумываем себе геморрой на смех СУБДшникам
КАК БЫ УДАЛЯЕМ записи. Понарошку.
Чтобы запрос сделать.
Они скоро ржать будут прочитав.

лучше рассмотреть такой ВИ:
Клиент-злостный неплательщик id=75
- редактируем
- удаляем клиента и каскадом все заказы
- flush()
- удалили из БД с кодом id=75
- запросы чтобы ЭТО увидеть
- откат - восстановили id=75 со всеми заказами
- думаем дальше в длинной транзакции что с ним делать :)
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37631284
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл никавторвопрос - зачем сохранять под этим id. И какой запрос пойдёт в БД?
- INSERT?
Пойдет конечно же инсерт.
Варианта 2, когда бы это могло быть необходимо, возможно есть еще.

1) У тебя был юзер айди = 5, ты его удалил(забанил) и т.п. Потом что-то случилось и тебе нужно восстановить именно с этим айди, ну не знаю, допустим логика завязана на айди, допустим если айди меньше 100, то это модератор, конечно лучше на айди вообще не завязываться, но вот такое бывает.
2) В рамках одной бизнес транзакции, ты создал юзера, создал ему коллекцию ченить и тп., и тебе нужен ключ, ну тоже не самый правильный вариант, но ситуация реальная.

да у меня именно второй вариант)
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37631287
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник,
реальная ситуация - я привёл. Метод №5.
Наверняка, визарды так делают.
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37631292
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторТАК НЕ БЫВАЕТ НИ В ОДНОЙ СИСТЕМЕ
Громкое заявление:) Вы еще многого не видели, я соглашусь что так не бывает в ГРАМОТНО СПРОЕКТИРОВАННОЙ системе, в которой бизнес логика никак не зависит от айди.
Так что 1) Бывают криво спроектированные приложения и 2)Унаследованные приложения 3) Приложения с бизнес-ключом, типа email

Лично я конечно не приемлю таких действий, но уж коли понадобилось - то нужно писать кастомный генератор айди.
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37631304
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник,
эт согласен :)
Программист может всё. Даже id сортировку.
Один чел был не доволен, что его ФИО на "Я" всё время было последним в списках.
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37631319
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123забыл ник,
реальная ситуация - я привёл. Метод №5.
Наверняка, визарды так делают.

возможно, но мне то не вариант в этом варианте нельзя юзать хибернате, ну да ладно насчет хиберната, там же надо руками писать вставку и удаление вставки, держать видимо зафиксирован объект или нет и от какой сессии(в моем случая пользователь может открыть несколько карточек в 1 сесии, так что пользователь + сессия + карточка), писать с учетом этого запросы на выборки ну и т.д. Разве я не прав? Это проще?
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37631332
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
slipperyPetro123забыл ник,
реальная ситуация - я привёл. Метод №5.
Наверняка, визарды так делают.

возможно, но мне то не вариант в этом варианте нельзя юзать хибернате, ну да ладно насчет хиберната, там же надо руками писать вставку и удаление вставки, держать видимо зафиксирован объект или нет и от какой сессии(в моем случая пользователь может открыть несколько карточек в 1 сесии, так что пользователь + сессия + карточка), писать с учетом этого запросы на выборки ну и т.д. Разве я не прав? Это проще?

так у меня задача на это не заканчивается след шаг, это прикрутка версионности с возможностью отката. Я надеюсь что тот же Envers заработает автоматом, а в 5 варианте это все руками писать надо.
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37631358
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slippery,
- во все запросы надо фильтр прописать where field = idSession
- вставка и удаление КАК ОБЫЧНО и сразу в БД
- что значит несколько карточек при ОДНОЙ СЕССИИ HTTP?
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37631363
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slippery,
Карточка Петров и карточка Иванов это 2 строки в БД или 2 экземпляра класса с флагами IdSession
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37631877
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123slippery,
Карточка Петров и карточка Иванов это 2 строки в БД или 2 экземпляра класса с флагами IdSession

карточкой я назвал каркас(мастер, визард) для работы с объектами к примеру "пользователь", в разных закладках браузера, клиент может открыть на редактирование и петрова и иванова. Получается, что каркас является что-то типа сессионным объектом. создается этот каркас наследованнием от определенного класса. и висит себе в памяти, все кнопки и прочие элементы управления на этом каркасе при нажатии посылают конкретному экземпляру каркаса события. Поэтому если атрибутом каркаса при его создании сделать к примеру ссылку на сервис, то в обработчике событий от кнопок не надо снова получать сервис, а достаточно обратится по ссылке которую хранит каркас. В сессии пользователя(после его авторизации) в разных вкладках, он может открывать разнобразные карточки(каркасы) разных объектов системы. Это реально удобно при редактировании или еще чего.
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37631880
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
это как бы форма и ее контроллер, создается форма, создается контроллер, контроллер висит в памяти , форма посылает контроллеру аяксом запросы которые он обрабатывает. На каждую форму свой контроллер. Визард в моем случаи это отдельная форма со своим контроллером(каркасом), в форме визарда есть несколько кнопок и элемент таббокс. таббокс имеет закладки. каждая закладка это уже другая форма с ее контроллером. Это стандартная схема работы зкосс. Ну это как сделано просто рассказал
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37631911
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос про генератор, что-то я так и не понял как мой генератор подцепить теперь к сущностям, как хибернат на него настроить или указать чтоб он этот класс взял вместо стандартного? Должен же быть способ если не править исходники хиберната и не добавлять туда свой генератор
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37631996
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slippery,

Все что ты написал это обычный ОПП. Он и так работает без твоего ТЗ.
Простой вопрос. Завел Петрова во второй вкладке. В первой его нужно видеть?
Если да. То ты его увидишь по ид сессии.:)
меня удивляет когда люди не видят простого решения.
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37632694
slippery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123slippery,

Все что ты написал это обычный ОПП. Он и так работает без твоего ТЗ.
Простой вопрос. Завел Петрова во второй вкладке. В первой его нужно видеть?
Если да. То ты его увидишь по ид сессии.:)
меня удивляет когда люди не видят простого решения.

можно и id сессии сделать и сохранять "временные" объекты, но тогда:
1) надо добавлять 2 условия во все выборки sessionId is null or sessionId = <переданный параметр в запросы из карточки>
2) во все запросы просто системы надо добавлять условие sessionId is null
3) так как уже посмотрел Envers а он по коммите генерит новую ревизию, то надо также делать и ревизию "временной"
4) писать сборщик муссора на временные объекты в системе и на временные ревизии(если делать через Envers)

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

если мы во вкладке 2 изменили Петрову инфу, во вкладке 1 должны это видеть

Но другие пользователи, не должны видеть, что Петрову изменили инфу. То есть все равно механизм держать изменения в памяти сбрасывать перед выполнением запроса и откатывать остается прежним. По моему тогда в этом механизме и логично сделать примерно то что я и собираюсь.
...
Рейтинг: 0 / 0
Нестандартное сохранение сущности в hibernate
    #37632918
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slipperyя бы не сказал что это простое решение......
дык ты всё критикуешь 5-ое и ничего не ответил на прямо поставленный вопрос по 3-му.

Мне нравятся такие программисты. Будут писать и усложнять в ТЗ только для своего удовольствия.

- Откуда взялся вопрос последних 2-х страниц про смену ID и "вкладках"? В первом ТЗ этого не было.
Там было: Длинная Правящая бизнес-транзакция на сессию.

Техническая часть:
- разницу в модальном и немодальном окне понимаешь? Если ты решил сделать НЕСКОЛЬКО ДЛИННЫХ транзакции БЕЗ поддержки хибером, то ты будешь руками делать все их атрибуты (атомарность\повторяемость\изоляция).
Т.е. в любом варианте будет геморрой - ставь мьютексы\семафоры\хачь Хибер и т.д.

БЛ-ГУИ часть:

- что будет, если сделать вместо модального окна "Перевод счёта" - не модальное или вкладки?
Правильно - тебя посадят на счётчик, пока не исправишь.
Зачем польз-лю в 3-4 вкладках запускать Длинные Правящие транзакции и уходить на обед?

ЗЫ
Через неделю ты придёшь с вопросом - почему банковский счёт перепрыгнул в session.SaveOrUpdate
Удачи!
______________________________________________
"Сложнее всего в мире достигнуть простоты — это крайняя граница опыта и последнее усилие гения". © George Sand.
AutoPOI.ru — ГИС-технологии для Oracle
...
Рейтинг: 0 / 0
59 сообщений из 59, показаны все 3 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Нестандартное сохранение сущности в hibernate
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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