powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate_sequence + spring jdbc
36 сообщений из 36, показаны все 2 страниц
hibernate_sequence + spring jdbc
    #38962823
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую!

Есть приложение, работает через хибернейт, соответственно при начале его работы в бд postgresql была создана последовательность hibernate_sequence от которой все инсерты и пляшут.
Сейчас пишу дополнительно приложение, на свинг, которое работает с базой используя spring jdbc.
Не знаю как написать инсерт, чтобы поле id у нового объекта заполнялось учитывая хибернейтовский сиквенс, да еще и меняло его.
Можно сгенерировать id самому, но ведь будет попа если при этом не будет меняться основная, хибернейтовская, последовательность.
Что посоветуете?

есть масса примеров в сети, допустим здесь , как писать инсерты, но что-то у меня не выходит...
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38962827
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во многих местах видел, что сначала выполняется инсерт, а затем вставленной строке присаивается id, примари кей.
Но у меня выдает ошибку, что id не может быть null. Что логично.
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38962830
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
причем пишется примерно следующее в интернетах:
Postgresql, get generated sequence after insert with JDBC

Почему AFTER insert, когда надо id присвоить до вставки... :)
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38962868
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А все, вопрос больше к постгресу относился, примерно такой код должен быть, на тестовой табличке сработал.
Код: java
1.
2.
3.
4.
5.
6.
String sql = "insert into users(id, visibleName) values (nextval('hibernate_sequence'), 'блаблаюзер')";
        try (Connection c = pool.getDataSource().getConnection()) {
            try (Statement ps = c.createStatement()) {
                ps.executeUpdate(sql);
            }
        }
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38962869
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правда без спринга, но раз уже "нашелся"
nextval('hibernate_sequence')
то дальше не сложно
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38962885
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixicпричем пишется примерно следующее в интернетах:
Postgresql, get generated sequence after insert with JDBC

Почему AFTER insert, когда надо id присвоить до вставки... :)

наверно потому что если делать наоборот то получите объект с уникальным Id но которого еще нет в БД.
желаемый же результат обычно, либо получить объект с уникальным id и соотвествующей записью в БД либо выкинуть ошибку.

nextval('hibernate_sequence') -- это по умолчанию последовательность создаваемая hibernate(если явно не было указано наименование последовательности). если Insert-ов не будет ну ооооочень много то этого вполне достаточно.

но можно для каждой сущности создать отдельную последовательность только на @Id надо прописать наименование последовательности.
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38962887
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NixicЕсть приложение, работает через хибернейт, соответственно при начале его работы в бд postgresql была создана последовательность hibernate_sequence от которой все инсерты и пляшут.

Не надо пускать присвоение ID на самотёк. А то потом придётся много плакать. Нескоро, как раз когда всё менять будет очень тяжело.
Отдельный метод "дай мне ID", и вызывать его ПЕРЕД вставкой.
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38962891
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторпричем пишется примерно следующее в интернетах:
Postgresql, get generated sequence after insert with JDBC

это в контексте например вашего же запроса
Как получить id Только что вставленной записи в таблицу users ?
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38963243
Dim666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
llemingКак получить id Только что вставленной записи в таблицу users ?В Postgres-е: "insert into users ... returning id;".
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38963382
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dim666llemingКак получить id Только что вставленной записи в таблицу users ?В Postgres-е: "insert into users ... returning id;".

Я просто хотел подчеркнуть это топикстартеру почему такой вопрос часто возникает. Его пример не слишком удачный что бы это подчеркнуть.
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38963610
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
База пашет уже 2 года, сиквенс перевалил уже за 780000.
Получается, что сейчас лучше сделать пару последовательностей ручками в табличках, куда более менее много записей падает?
Или лучше сделать это на уровне хибернейта, а вторым приложением просто использовать их?
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38963619
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tomin,

я просто немного не понял, почему всё пущено на самотек, ведь последовательность срабатывает каждый раз...
в чем могут быть проблемы в дальнейшем?

у этой последовательности максимум это 9223372036854775807
а сейчас текущее значение всего 780000+
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38963795
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NixicAlexey Tomin,

я просто немного не понял, почему всё пущено на самотек, ведь последовательность срабатывает каждый раз...

Проблема будет не в этом. А том, например, что где-то будет надо узнать ID до вставки в БД. Например если есть циклические ссылки. Или логирование хитрое. Да мало ли что.

Или ещё вишенка на торте. Если вы включаете ID в хэш-код и equals (а иногда без этого никак), то после insert объект уже другой. А вставка (и генерация ID) может пройти незаметно для этого закоулка кода. И что тут будет- лучше не знать на опыте.

Nixicв чем могут быть проблемы в дальнейшем?

у этой последовательности максимум это 9223372036854775807
а сейчас текущее значение всего 780000+

Ну это-то мелочь. Как раз предгенерация ID ведёт к "лишнему" расходованию ID - мало ли почему вставка не прошла, а ID-то уже взяли.
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38964049
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tomin
Ну это-то мелочь. Как раз предгенерация ID ведёт к "лишнему" расходованию ID - мало ли почему вставка не прошла, а ID-то уже взяли.

в Postgresql генереция sequence вне транзакции идет. Разницы нет получить из БД след. id и вставить в users, или вставить в users а postgresql сам сгенерирует id.
В любом случае
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38964052
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В любом случае при ошибке sequence будет увеличится на 1.
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38964107
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
llemingВ любом случае при ошибке sequence будет увеличится на 1.

Если ты вставляешь по одной записи за раз- да.
А если надо вставить клубок из 10ка записей, а на первой вставке ошибка, то твой вариант "потратит" 1 ID, а мой- 10.
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38964265
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NixicСейчас пишу дополнительно приложение,
если много \ разных приложений к БД, то чем глубже назначение ID, тем лучше (триггер самой БД).
Отсюда и плясать, т.к. целостность данных наше всё!
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38964268
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗЫ. В 12-том оракле появился тип поля - счётчик
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38964312
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123NixicСейчас пишу дополнительно приложение,
если много \ разных приложений к БД, то чем глубже назначение ID, тем лучше (триггер самой БД).

Да, да- больше ада!
Ещё раз- когда сущность внезапно меняет свой ID - это нехорошо. Это может вылезти боком.
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38964320
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominЕщё раз- когда сущность внезапно меняет свой ID - это нехорошо. Это может вылезти боком.
с чего она сменит пол ID?
Хибер по ID и определяет сущность.
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38964368
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Alexey TominЕщё раз- когда сущность внезапно меняет свой ID - это нехорошо. Это может вылезти боком.
с чего она сменит пол ID?
Хибер по ID и определяет сущность.

У тебя в java-коде.
Было entity.getId() == null, а потом вдруг entity.getId() == 123. Вот счастье, да?
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38964389
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tomin,
ты полный кейс приведи, если не лень.
С чего у меня так будет?
Давай не путать когда 2-ое приложение лезет в обхход хибера и где назначать счётчик.
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38964443
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123ты полный кейс приведи, если не лень.
С чего у меня так будет?
Давай не путать когда 2-ое приложение лезет в обхход хибера и где назначать счётчик.

Entity entity = new Entity(); //entity.id == null
передали в какой-то другой сервис, тот значение сохранил.
em.insert(entity); // А теперь entity.id != null
передали в тот же сервис, тот сравнивает- значение другое (т.к. id другой).
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38964464
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominEntity entity = new Entity(); //entity.id == null
передали в какой-то другой сервис, тот значение сохранил.
- отсоединять объект от сессии хибера нельзя
- сессия хибера должна быть как можно короче, напр 0,01 сек.
Отсюда твой пример не верен.
- либо закрой сессию и получишь ID.
Либо отсоедини от сессии и тогда объект обезличен.
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38964468
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tomin,
при передаче объекта в рамках одной сессии ( в памяти), хибер гарантирует идентичность объектов.
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38964473
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пусть сделает метод получения ID - IDENTITY с триггером
Не выйдет, тогда SEQUENCE с сиквенсом на каждую таблицу
Удачи аффтару!
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38964542
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Alexey TominEntity entity = new Entity(); //entity.id == null
передали в какой-то другой сервис, тот значение сохранил.
- отсоединять объект от сессии хибера нельзя
- сессия хибера должна быть как можно короче, напр 0,01 сек.
Отсюда твой пример не верен.
- либо закрой сессию и получишь ID.
Либо отсоедини от сессии и тогда объект обезличен.

Фигню пишешь.
Ещё раз- создал объект, передал в метод, который его сохранил, и теперь это другой объект - т.к. всё проверяется по equals, который (вполне возможно) включает ID.
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38964562
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tomin,
Передал по ссылке?
Зачем его сравнивать?
Я вроде описал стандарт работы по документации.
Даже 2 варианта, если бд поддерживает.
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38964775
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Передал по ссылке?
Зачем его сравнивать?

Нет, не надо ничего сравнивать. Меньше кода- меньше ошибок. Лучше вообще софт не писать- ошибок и не будет.
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38964926
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominPetro123Передал по ссылке?
Зачем его сравнивать?

Нет, не надо ничего сравнивать. Меньше кода- меньше ошибок. Лучше вообще софт не писать- ошибок и не будет.

сравнивать надо, но зачем сравнивать несохраненную сущность с другой сущностью смысла нет особого.
Все сущности меняют ID внезапно(метод setID ведь есть) если только ID вы не генерируете на уровне app и не передаете в конструктор.
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38964940
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
llemingно зачем сравнивать несохраненную сущность с другой сущностью смысла нет особого.
+1
Т.е. взял с БД, изменил и сразу обратно скинул (первый кеш)
тем более что есть приложение лезущее напрямую в БД без ОРМ.
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38965044
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
llemingсравнивать надо, но зачем сравнивать несохраненную сущность с другой сущностью смысла нет особого.

Код пишется по принципу "меньше знаешь- крепче спишь". Поэтому код бизнес-логики может не знать, что за объект ему передан, откуда он, сохранён ли он.

Банально- оператор редактирует некий сложный объект в памяти. До попытки сохранить ему надо сказать, можно ли его будет сохранить. Для этого надо лезть в БД (иногда код реально такой, что крыша едет- бизнес, блин, требования). Но редактируемый объект надо исключить из выборки. Если есть ID- всё просто. Если нет- уже надо на null проверку лишнюю ставить- а это лишние проблемы.

llemingВсе сущности меняют ID внезапно(метод setID ведь есть) если только ID вы не генерируете на уровне app и не передаете в конструктор.

Я за суррогатный ключ всегда и везде. Как результат- ID никогда не меняется. А присвоение ID- как уже сказал- лучше делать сразу после создания, вызвав метод (который сам бегает в последовательность БД, а в дальнейшем- ещё и кэширует значения, чтобы БД не грузить, беря оттуда по 10 штук, к примеру).

А метод setId у меня всегда проверяет, что id был null (ну или 0, если long), а если не так- RuntimeException по рукам.
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38965083
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominЕсли есть ID- всё просто. Если нет- уже надо на null проверку лишнюю ставить- а это лишние проблемы.
Что спорить? Лучше быть богатым и здоровым.
Только бывает код и на клиенте JS. Когда ID'a ещё нет.
И после строки Create Object - тоже его нет.
Короче аффтар - будет конкретная проблема - пиши)).
Кода нет - ответ стандартный:
- хорошо бы ID пораньше и отсутствие твоего параллельного свинг-приложения.
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38965094
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

спасибо, будем работать дальше :)
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38965196
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominЯ за суррогатный ключ всегда и везде. Как результат- ID никогда не меняется. А присвоение ID- как уже сказал- лучше делать сразу после создания, вызвав метод (который сам бегает в последовательность БД, а в дальнейшем- ещё и кэширует значения, чтобы БД не грузить, беря оттуда по 10 штук, к примеру).

А метод setId у меня всегда проверяет, что id был null (ну или 0, если long), а если не так- RuntimeException по рукам.
ты шурупы тоже молотком вкручиваешь? нахрена вот эта ересь про "везде и всегда"?
...
Рейтинг: 0 / 0
hibernate_sequence + spring jdbc
    #38965264
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В схеме "один:многие:один" промежуточная таблица может иметь составной PK. И он не обязательно
должен быть суррогатом.
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate_sequence + spring jdbc
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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