JPA: генерирование айдишника с помощью таблицы
В sqlite удобно использовать для генерации айди таблицу sequence, в которой хранится номер следующего добавляемого айдишника для каждой таблицы.
В энтити используется аннотация @TableGenerator для обозначения генератора и параметров что откуда брать.
Выглядит это так:
Что есть в аннотации @GeneratedValue (указвыавем каким способом мы хотим генерировать айди):
generator - название генератора, произвольно задается в аннотации @TableGenerator
strategy - стратегия, выбирается из имеющегося списка
И самое интересное @TableGenerator (указываем как именно будут эти значения генерироваться):
name - произвольное название генератора айди
table - название таблицы в которой хранится инфа об айди например sequence
pkColumnName - название колонки таблицы, в которой хрянятся названия наших уникальных генераторов, например name_generator.
valueColumnName - название той колонки таблицы в которой хратится число, само подставляемое айди, увеличивается автоматически
pkColumnValue - значение строковго айди (из колонки pkColumnName) по которому ищем нашу строку-генератор, например my_user_generator
allocationsize - шаг увеличения айди, число, например 1.
Этот сумбур покажу на картинке чтобы понятнее:
В энтити используется аннотация @TableGenerator для обозначения генератора и параметров что откуда брать.
Выглядит это так:
@Entity @Table(name = "Cat") public class Cat implements Serializable { private static final long serialVersionUID = 1L; @Id @Basic(optional = false) @Column(name = "id") @GeneratedValue(generator = "catIdGenerator", strategy = GenerationType.SEQUENCE) @TableGenerator(name = "catIdGenerator", table = "sqlite_sequence", pkColumnName = "name", valueColumnName = "seq", pkColumnValue = "cat_gen", allocationSize = 5) private Integer id; @Column(name = "name") private String name; public Cat() { } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }В бд создается таблица с двумя колонками, в которой хранится следующий айдишник который будет подставляться в базу.
Что есть в аннотации @GeneratedValue (указвыавем каким способом мы хотим генерировать айди):
generator - название генератора, произвольно задается в аннотации @TableGenerator
strategy - стратегия, выбирается из имеющегося списка
И самое интересное @TableGenerator (указываем как именно будут эти значения генерироваться):
name - произвольное название генератора айди
table - название таблицы в которой хранится инфа об айди например sequence
pkColumnName - название колонки таблицы, в которой хрянятся названия наших уникальных генераторов, например name_generator.
valueColumnName - название той колонки таблицы в которой хратится число, само подставляемое айди, увеличивается автоматически
pkColumnValue - значение строковго айди (из колонки pkColumnName) по которому ищем нашу строку-генератор, например my_user_generator
allocationsize - шаг увеличения айди, число, например 1.
Этот сумбур покажу на картинке чтобы понятнее:
![]() |
Что куда: использование таблицы для генерации айди |
В этой конфигурации указан шаг генерации айди = 5 (allocationSize = 5). И значение первого айди = 1.
И что же добавится в базу, проверю:
![]() |
Доверяй, но проверяй |
svn
P.s ради интереса загляну в sequence. И там все как надо. День удался.
0 comments:
Отправить комментарий