About

13 февр. 2015 г.

JPA: генерирование айдишника с помощью таблицы


В sqlite удобно использовать для генерации айди таблицу sequence, в которой хранится номер следующего добавляемого айдишника для каждой таблицы.
В энтити используется аннотация @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.
И что же добавится в базу, проверю:

Доверяй, но проверяй
Все как и положено - начиная с айди 1 с шагом 5. Одной проблемой меньше, а значит жить стало лучше, жить стало веселее.

svn

P.s ради интереса загляну в sequence. И там все как надо. День удался.  



0 comments:

Отправить комментарий