hibernate, generator
От: newuser  
Дата: 24.01.15 15:29
Оценка:
Есть база на firebird, в базе таблица, id которой увеличивает генератор. Как сделать, чтобы при создании объекта id брался из базы?
Делаю так:

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="TYPE_OBJECT_GEN")
@SequenceGenerator(name="TYPE_OBJECT_GEN", sequenceName="TYPE_OBJECT_GEN", allocationSize=1)
@Column(name = "ID")
public int getId() {
  return id;
}


Получается как-то странно, в базе создается запись,допустим, с id 1, а у объекта id 2. После повторного создания в базе id 3, а у объекта id 4
Отредактировано 24.01.2015 15:29 newuser . Предыдущая версия .
Re: hibernate, generator
От: Blazkowicz Россия  
Дата: 24.01.15 16:54
Оценка:
Здравствуйте, newuser, Вы писали:

N>
N>@Id
N>@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="TYPE_OBJECT_GEN")
N>@SequenceGenerator(name="TYPE_OBJECT_GEN", sequenceName="TYPE_OBJECT_GEN", allocationSize=1)
N>

N>Получается как-то странно, в базе создается запись,допустим, с id 1, а у объекта id 2. После повторного создания в базе id 3, а у объекта id 4

Похоже что 2 у тебя ID генерируется два раза. 1й раз при вставке записи, база использует триггер и sequence и генерирует Id. А потом ещё и хибер следуя аннотациям использует тот же sequence и тоже генерирует id.
Поэтому нужно либо убрать генерацию на уровне БД, что не очень-то удобно. Либо аннотации прописать попроще. GenerationType.AUTO или что-то такое. Всё про Sequence из маппинга убрать.
Re[2]: hibernate, generator
От: newuser  
Дата: 24.01.15 17:03
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, newuser, Вы писали:


N>>
N>>@Id
N>>@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="TYPE_OBJECT_GEN")
N>>@SequenceGenerator(name="TYPE_OBJECT_GEN", sequenceName="TYPE_OBJECT_GEN", allocationSize=1)
N>>

N>>Получается как-то странно, в базе создается запись,допустим, с id 1, а у объекта id 2. После повторного создания в базе id 3, а у объекта id 4

B>Похоже что 2 у тебя ID генерируется два раза. 1й раз при вставке записи, база использует триггер и sequence и генерирует Id. А потом ещё и хибер следуя аннотациям использует тот же sequence и тоже генерирует id.

B>Поэтому нужно либо убрать генерацию на уровне БД, что не очень-то удобно. Либо аннотации прописать попроще. GenerationType.AUTO или что-то такое. Всё про Sequence из маппинга убрать.
сделал так:
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID")
    public int getId() {
        return id;
    }


но объекту присваиваются значения 1,2,3,4
Re[3]: hibernate, generator
От: Blazkowicz Россия  
Дата: 24.01.15 18:00
Оценка:
Здравствуйте, newuser, Вы писали:

N>но объекту присваиваются значения 1,2,3,4

А какие должны?
Re: hibernate, generator
От: vsb Казахстан  
Дата: 24.01.15 20:45
Оценка:
Здравствуйте, newuser, Вы писали:

N>Есть база на firebird, в базе таблица, id которой увеличивает генератор. Как сделать, чтобы при создании объекта id брался из базы?


Для Postgres работает такой метод:

create table xxx {
  id serial primary key,
  ...


class xxx {
  @Id @GeneratedValue(strategy = IDENTITY)
  private Integer id;
  ...



может и для Firebird сработает? В данном случае в базу уходит insert into xxx (id, ...) values (DEFAULT, ...), база сама генерирует id и возвращает его.
Re[4]: hibernate, generator
От: newuser  
Дата: 25.01.15 02:37
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, newuser, Вы писали:


N>>но объекту присваиваются значения 1,2,3,4

B>А какие должны?
в базе 61,62,63, а у объекта 1,2,3,4
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.