powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA стратегия генерации id
16 сообщений из 16, страница 1 из 1
JPA стратегия генерации id
    #39177381
Юрий321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всем привет

не могу вьехать в генерацию ид, не хватает познаний в теории рбд.

ситуация такая
в базу для программы-учетки, первым этапом, конвертируются данные из старой версии, делаю persist() с существующим ид из старой базы.
вторым этапом операторы системы добавляют записи (сущности), в них ид автогенерируются.

и вот на втором этапе постоянно ловлю ошибку duplicate key value violates unique constraint, Key (id)=(ххх) already exists.

почитал СО, сделал собственную для таблицы последовательность:
Код: java
1.
2.
3.
    @GeneratedValue(strategy= GenerationType.SEQUENCE, generator="ХххSeq")
    @SequenceGenerator(name = "ХххSeq", sequenceName = "ХХХ_SEQ", allocationSize = 1, initialValue = 1)
    private Long id;



не помогло.
дефолтная @GeneratedValue(strategy = GenerationType.AUTO) тоже не работает.

как быть?
можно или нельзя совместить автогенерацию ид с возможность использовать существующий ид без генерации?
...
Рейтинг: 0 / 0
JPA стратегия генерации id
    #39177402
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Юрий321,

Вашу проблему надо решить на уровне RDBMS, а потом уже просто применить решение в JPA. JPA решением этой проблемы не занимается. Какая у вас база? Как у вас настроены первичные ключи?
...
Рейтинг: 0 / 0
JPA стратегия генерации id
    #39177408
Юрий321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЮрий321,

Вашу проблему надо решить на уровне RDBMS, а потом уже просто применить решение в JPA. JPA решением этой проблемы не занимается. Какая у вас база? Как у вас настроены первичные ключи?

постгрес.

ключи никак не сконфигурированы.

создана пустая база + юзер.

в persistence.xml есть проперти
Код: xml
1.
<property name="javax.persistence.schema-generation.database.action" value="create-tables"/>



таблицы генерируются из сущностией.
...
Рейтинг: 0 / 0
JPA стратегия генерации id
    #39177411
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Юрий321таблицы генерируются из сущностией.
Этот вариант годится только для черновой прототипизации. Для полноценной системы дизайн БД должен делать разработчик.
Если вы не смыслите в базах, то ORM вам не помошник от слова "вообще".
...
Рейтинг: 0 / 0
JPA стратегия генерации id
    #39177413
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Юрий321,

GenerationType.AUTO зависит от каждой конкретной базы. На сколько я понимаю в postgres должен быть serial PK, либо sequence + trigger. Но в этом случае для вставки значения PK нужно мучатся с отключение генерации.
GenerationType.SEQUENCE может заработать. Только работать оно будет без триггера.
Если использовать Hibernate, то с ним есть и ещё варианты.

В любом случае базу данных надо создать руками. Совершенно не факт, что ORM для вас создаст правильную структуру таблиц и sequence.
Для поддержки структуры БД в актуальном состоянии удобно пользоваться инструментами миграции Liquibase или Flyway.
...
Рейтинг: 0 / 0
JPA стратегия генерации id
    #39177438
breath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>можно или нельзя совместить автогенерацию ид с возможность использовать существующий ид без генерации?
в постгре auto_increment работает через SEQUENCE и nextval.
следовательно при инсерте нужно работать только с ним.
...
Рейтинг: 0 / 0
JPA стратегия генерации id
    #39177444
Юрий321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
breath>можно или нельзя совместить автогенерацию ид с возможность использовать существующий ид без генерации?
в постгре auto_increment работает через SEQUENCE и nextval.
следовательно при инсерте нужно работать только с ним.

то есть делать инсерт с ид с потолка нельзя?

вцелом понял.
нужно разделить задачу на два этапа, импорт старых данных + переход на ввод данных операторами.
...
Рейтинг: 0 / 0
JPA стратегия генерации id
    #39177454
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
breathв постгре auto_increment работает через SEQUENCE и nextval.
http://www.postgresql.org/docs/8.1/static/datatype.html#DATATYPE-SERIAL
...
Рейтинг: 0 / 0
JPA стратегия генерации id
    #39177461
breath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и ?
...
Рейтинг: 0 / 0
JPA стратегия генерации id
    #39177463
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
breathи ?
и не только
...
Рейтинг: 0 / 0
JPA стратегия генерации id
    #39177476
breath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
секвенсы сделаны специально для получения последовательных уникальных значений.
при создании serial поля автоматически создается соответствующий sequence..
и при дропе таблицы севенс дропается автоматом.
тс`у
https://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Sequence_Strategies
...
Рейтинг: 0 / 0
JPA стратегия генерации id
    #39177746
mrWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Юрий321то есть делать инсерт с ид с потолка нельзя?
Можно.
Юрий321вцелом понял.
нужно разделить задачу на два этапа, импорт старых данных + переход на ввод данных операторами.
Именно так.
Вам надо импортировать существующие данные, потом средствами базы создать последовательность с начальным значением больше максимального id из загруженных , а дальше уже использовать ее не боясь duplicate key value violates
И уберите initialValue = 1 из @SequenceGenerator. Это нужно если таблицы и последовательности вам JPA(Hibrnate) создает.
...
Рейтинг: 0 / 0
JPA стратегия генерации id
    #39177787
Юрий321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mrWolfЮрий321то есть делать инсерт с ид с потолка нельзя?
Можно.
Юрий321вцелом понял.
нужно разделить задачу на два этапа, импорт старых данных + переход на ввод данных операторами.
Именно так.
Вам надо импортировать существующие данные, потом средствами базы создать последовательность с начальным значением больше максимального id из загруженных , а дальше уже использовать ее не боясь duplicate key value violates
И уберите initialValue = 1 из @SequenceGenerator. Это нужно если таблицы и последовательности вам JPA(Hibrnate) создает.

ага, так и сделал.

теперь такой вопрос, как грамотнее минимизировать потенциальные проблемы - создавать по сиквенсу на каждую таблицу с ид,
или использовать дефолтный, один сиквенс на все таблицы?
...
Рейтинг: 0 / 0
JPA стратегия генерации id
    #39177791
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Юрий321,

Используйте serial и не парьтесь. Конечно же sequence на каждую таблицу.
...
Рейтинг: 0 / 0
JPA стратегия генерации id
    #39177799
Юрий321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЮрий321,

Используйте serial и не парьтесь. Конечно же sequence на каждую таблицу.

понял.

непонятно, зачем так сделано по дефолту, ид поле создается не сериал, и один общий сиквенс на всех.
...
Рейтинг: 0 / 0
JPA стратегия генерации id
    #39177841
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Юрий321непонятно, зачем так сделано по дефолту, ид поле создается не сериал, и один общий сиквенс на всех.
Где сделано?
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA стратегия генерации id
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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