|
|
|
hibernate_sequence + spring jdbc
|
|||
|---|---|---|---|
|
#18+
Приветствую! Есть приложение, работает через хибернейт, соответственно при начале его работы в бд postgresql была создана последовательность hibernate_sequence от которой все инсерты и пляшут. Сейчас пишу дополнительно приложение, на свинг, которое работает с базой используя spring jdbc. Не знаю как написать инсерт, чтобы поле id у нового объекта заполнялось учитывая хибернейтовский сиквенс, да еще и меняло его. Можно сгенерировать id самому, но ведь будет попа если при этом не будет меняться основная, хибернейтовская, последовательность. Что посоветуете? есть масса примеров в сети, допустим здесь , как писать инсерты, но что-то у меня не выходит... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2015, 15:21 |
|
||
|
hibernate_sequence + spring jdbc
|
|||
|---|---|---|---|
|
#18+
Во многих местах видел, что сначала выполняется инсерт, а затем вставленной строке присаивается id, примари кей. Но у меня выдает ошибку, что id не может быть null. Что логично. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2015, 15:22 |
|
||
|
hibernate_sequence + spring jdbc
|
|||
|---|---|---|---|
|
#18+
причем пишется примерно следующее в интернетах: Postgresql, get generated sequence after insert with JDBC Почему AFTER insert, когда надо id присвоить до вставки... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2015, 15:24 |
|
||
|
hibernate_sequence + spring jdbc
|
|||
|---|---|---|---|
|
#18+
А все, вопрос больше к постгресу относился, примерно такой код должен быть, на тестовой табличке сработал. Код: java 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2015, 15:43 |
|
||
|
hibernate_sequence + spring jdbc
|
|||
|---|---|---|---|
|
#18+
Правда без спринга, но раз уже "нашелся" nextval('hibernate_sequence') то дальше не сложно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2015, 15:44 |
|
||
|
hibernate_sequence + spring jdbc
|
|||
|---|---|---|---|
|
#18+
Nixicпричем пишется примерно следующее в интернетах: Postgresql, get generated sequence after insert with JDBC Почему AFTER insert, когда надо id присвоить до вставки... :) наверно потому что если делать наоборот то получите объект с уникальным Id но которого еще нет в БД. желаемый же результат обычно, либо получить объект с уникальным id и соотвествующей записью в БД либо выкинуть ошибку. nextval('hibernate_sequence') -- это по умолчанию последовательность создаваемая hibernate(если явно не было указано наименование последовательности). если Insert-ов не будет ну ооооочень много то этого вполне достаточно. но можно для каждой сущности создать отдельную последовательность только на @Id надо прописать наименование последовательности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2015, 15:56 |
|
||
|
hibernate_sequence + spring jdbc
|
|||
|---|---|---|---|
|
#18+
NixicЕсть приложение, работает через хибернейт, соответственно при начале его работы в бд postgresql была создана последовательность hibernate_sequence от которой все инсерты и пляшут. Не надо пускать присвоение ID на самотёк. А то потом придётся много плакать. Нескоро, как раз когда всё менять будет очень тяжело. Отдельный метод "дай мне ID", и вызывать его ПЕРЕД вставкой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2015, 15:57 |
|
||
|
hibernate_sequence + spring jdbc
|
|||
|---|---|---|---|
|
#18+
авторпричем пишется примерно следующее в интернетах: Postgresql, get generated sequence after insert with JDBC это в контексте например вашего же запроса Как получить id Только что вставленной записи в таблицу users ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2015, 15:58 |
|
||
|
hibernate_sequence + spring jdbc
|
|||
|---|---|---|---|
|
#18+
llemingКак получить id Только что вставленной записи в таблицу users ?В Postgres-е: "insert into users ... returning id;". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2015, 19:12 |
|
||
|
hibernate_sequence + spring jdbc
|
|||
|---|---|---|---|
|
#18+
Dim666llemingКак получить id Только что вставленной записи в таблицу users ?В Postgres-е: "insert into users ... returning id;". Я просто хотел подчеркнуть это топикстартеру почему такой вопрос часто возникает. Его пример не слишком удачный что бы это подчеркнуть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2015, 23:17 |
|
||
|
hibernate_sequence + spring jdbc
|
|||
|---|---|---|---|
|
#18+
База пашет уже 2 года, сиквенс перевалил уже за 780000. Получается, что сейчас лучше сделать пару последовательностей ручками в табличках, куда более менее много записей падает? Или лучше сделать это на уровне хибернейта, а вторым приложением просто использовать их? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2015, 10:03 |
|
||
|
hibernate_sequence + spring jdbc
|
|||
|---|---|---|---|
|
#18+
Alexey Tomin, я просто немного не понял, почему всё пущено на самотек, ведь последовательность срабатывает каждый раз... в чем могут быть проблемы в дальнейшем? у этой последовательности максимум это 9223372036854775807 а сейчас текущее значение всего 780000+ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2015, 10:07 |
|
||
|
hibernate_sequence + spring jdbc
|
|||
|---|---|---|---|
|
#18+
NixicAlexey Tomin, я просто немного не понял, почему всё пущено на самотек, ведь последовательность срабатывает каждый раз... Проблема будет не в этом. А том, например, что где-то будет надо узнать ID до вставки в БД. Например если есть циклические ссылки. Или логирование хитрое. Да мало ли что. Или ещё вишенка на торте. Если вы включаете ID в хэш-код и equals (а иногда без этого никак), то после insert объект уже другой. А вставка (и генерация ID) может пройти незаметно для этого закоулка кода. И что тут будет- лучше не знать на опыте. Nixicв чем могут быть проблемы в дальнейшем? у этой последовательности максимум это 9223372036854775807 а сейчас текущее значение всего 780000+ Ну это-то мелочь. Как раз предгенерация ID ведёт к "лишнему" расходованию ID - мало ли почему вставка не прошла, а ID-то уже взяли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2015, 11:25 |
|
||
|
hibernate_sequence + spring jdbc
|
|||
|---|---|---|---|
|
#18+
Alexey Tomin Ну это-то мелочь. Как раз предгенерация ID ведёт к "лишнему" расходованию ID - мало ли почему вставка не прошла, а ID-то уже взяли. в Postgresql генереция sequence вне транзакции идет. Разницы нет получить из БД след. id и вставить в users, или вставить в users а postgresql сам сгенерирует id. В любом случае ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2015, 13:31 |
|
||
|
hibernate_sequence + spring jdbc
|
|||
|---|---|---|---|
|
#18+
В любом случае при ошибке sequence будет увеличится на 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2015, 13:32 |
|
||
|
hibernate_sequence + spring jdbc
|
|||
|---|---|---|---|
|
#18+
llemingВ любом случае при ошибке sequence будет увеличится на 1. Если ты вставляешь по одной записи за раз- да. А если надо вставить клубок из 10ка записей, а на первой вставке ошибка, то твой вариант "потратит" 1 ID, а мой- 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2015, 13:57 |
|
||
|
hibernate_sequence + spring jdbc
|
|||
|---|---|---|---|
|
#18+
NixicСейчас пишу дополнительно приложение, если много \ разных приложений к БД, то чем глубже назначение ID, тем лучше (триггер самой БД). Отсюда и плясать, т.к. целостность данных наше всё! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2015, 15:22 |
|
||
|
hibernate_sequence + spring jdbc
|
|||
|---|---|---|---|
|
#18+
ЗЫ. В 12-том оракле появился тип поля - счётчик ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2015, 15:23 |
|
||
|
hibernate_sequence + spring jdbc
|
|||
|---|---|---|---|
|
#18+
Petro123NixicСейчас пишу дополнительно приложение, если много \ разных приложений к БД, то чем глубже назначение ID, тем лучше (триггер самой БД). Да, да- больше ада! Ещё раз- когда сущность внезапно меняет свой ID - это нехорошо. Это может вылезти боком. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2015, 15:46 |
|
||
|
hibernate_sequence + spring jdbc
|
|||
|---|---|---|---|
|
#18+
Alexey TominЕщё раз- когда сущность внезапно меняет свой ID - это нехорошо. Это может вылезти боком. с чего она сменит пол ID? Хибер по ID и определяет сущность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2015, 15:48 |
|
||
|
hibernate_sequence + spring jdbc
|
|||
|---|---|---|---|
|
#18+
Petro123Alexey TominЕщё раз- когда сущность внезапно меняет свой ID - это нехорошо. Это может вылезти боком. с чего она сменит пол ID? Хибер по ID и определяет сущность. У тебя в java-коде. Было entity.getId() == null, а потом вдруг entity.getId() == 123. Вот счастье, да? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2015, 16:13 |
|
||
|
hibernate_sequence + spring jdbc
|
|||
|---|---|---|---|
|
#18+
Alexey Tomin, ты полный кейс приведи, если не лень. С чего у меня так будет? Давай не путать когда 2-ое приложение лезет в обхход хибера и где назначать счётчик. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2015, 16:24 |
|
||
|
hibernate_sequence + spring jdbc
|
|||
|---|---|---|---|
|
#18+
Petro123ты полный кейс приведи, если не лень. С чего у меня так будет? Давай не путать когда 2-ое приложение лезет в обхход хибера и где назначать счётчик. Entity entity = new Entity(); //entity.id == null передали в какой-то другой сервис, тот значение сохранил. em.insert(entity); // А теперь entity.id != null передали в тот же сервис, тот сравнивает- значение другое (т.к. id другой). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2015, 16:56 |
|
||
|
hibernate_sequence + spring jdbc
|
|||
|---|---|---|---|
|
#18+
Alexey TominEntity entity = new Entity(); //entity.id == null передали в какой-то другой сервис, тот значение сохранил. - отсоединять объект от сессии хибера нельзя - сессия хибера должна быть как можно короче, напр 0,01 сек. Отсюда твой пример не верен. - либо закрой сессию и получишь ID. Либо отсоедини от сессии и тогда объект обезличен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2015, 17:10 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=130&tid=2125386]: |
0ms |
get settings: |
9ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
37ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 225ms |
| total: | 333ms |

| 0 / 0 |
