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:
Отправить комментарий