it-swarm.com.ru

Ошибка Postgres в пакетной вставке: отношение "hibernate_sequence" не существует, позиция 17

Я выполняю пакетное обновление jpa hibernate и выдает следующую ошибку

2015-04-21 15:53:51,907 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (Thread-283 (HornetQ-client-global-threads-462057890)) SQL Error: 0, SQLState: 42P01
2015-04-21 15:53:51,908 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (Thread-283 (HornetQ-client-global-threads-462057890)) ERROR: relation "my_seq_gen" does not exist

Я использую базу данных postgres и мой идентификатор генерируется автоматически 

  @Id
@SequenceGenerator(name="seq-gen",sequenceName="MY_SEQ_GEN"initialValue=205, allocationSize=12)
@GeneratedValue(strategy= GenerationType.SEQUENCE, generator="seq-gen")
@Column(name="\"ID\"",unique=true,nullable=false)
private int id;

Это мой фрагмент кода вставки пакета

getEm().getTransaction().begin();
System.out.println("transaction started--------------");
try {   
    for (Receipt ReceiptEntity : arrReceiptEntity) {
            getEm().persist(ReceiptEntity);
    }
    getEm().getTransaction().commit();
    System.out.println("commited");
} catch (Exception exception) {
    System.out.println("error----------------------------------------------------------------------");
    if(getEm().getTransaction().isActive())
        getEm().getTransaction().rollback();
    LOG.error(exception);
} finally {
    getEm().flush();
    getEm().clear();
    getEm().close();
}

Я добавил следующее свойство в persistence.xml

         <property name="hibernate.id.new_generator_mappings" value="true"/>

Пожалуйста, подскажите, что я делаю не так.

17
kirti

Попробуйте аннотировать id с помощью @Id и @GeneratedValue(strategy=GenerationType.IDENTITY). У меня это работало с PostgreSql.

ОБНОВЛЕНИЕ: Это будет работать, только если ваш столбец идентификатора был объявлен как типы SERIAL или BIGSERIAL.

28
Vsevolod Poletaev

Если вы не хотите изменять определение вашей сущности, вам нужно создать последовательность в вашей схеме postgreSQL с именем hibernate_sequence.

CREATE SEQUENCE hibernate_sequence START 1;

ОБНОВЛЕНИЕ:

Вам не хватает второй последовательности generatef, которую вы определили для вашей сущности, просто добавьте ее как предыдущую:

CREATE SEQUENCE my_seq_gen START 1;

Очень полезное руководство: http://www.concretepage.com/hibernate/generatedvalue-strategy-generationtype-sequence-hibernate

11
Beri

Я надеюсь, что вы получите ответ, но если вы все еще находите ответ, это может быть полезно.

У меня была та же проблема, и я решил ее, комментируя метод получения идентификатора с помощью @SequenceGenerator и @GeneratedValue.

@SequenceGenerator(name="seq-gen",sequenceName="MY_SEQ_GEN", initialValue=205, allocationSize=12)
@GeneratedValue(strategy= GenerationType.SEQUENCE, generator="seq-gen")
public int getId(){
    return id;
}
6
Sameer

Можете ли вы попробовать следующее: 

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO, generator = "auto_gen")
  @SequenceGenerator(name = "auto_gen", sequenceName = "A")
  @Column(name = "ID")
  private int id;

Спасибо

3
Mayur

У меня была такая же проблема. Я решил поставить автоматическое увеличение на столбец id из таблицы на postgres, это работает, вот так.

ALTER TABLE mytable ALTER COLUMN id SET DEFAULT nextval('mytable_id_seq');

ALTER SEQUENCE mytable_id_seq OWNED BY mytable.id; 
2
Sergeant

В моем случае добавление свойства name = "hibernate.hbm2ddl.auto" value = " update " решило проблему. Вы должны добавить указанное свойство в persistence.xml

1
Vijay Vikranth

Согласно сообщению, hibernate не может получить следующее значение последовательности установите столбец @GeneratedId со стратегией GenerationType.IDENTITY вместо GenerationType.SEQUENCE. Итак, вы бы 

@Id
@SequenceGenerator(name="seq-gen",sequenceName="MY_SEQ_GEN"initialValue=205, allocationSize=12)
@GeneratedValue(strategy= GenerationType.IDENTITY, generator="seq-gen")
@Column(name="\"ID\"",unique=true,nullable=false)
private int id;
1
Ifesinachi Bryan

Иногда с аннотацией @Id @GeneratedValue(strategy=GenerationType.IDENTITY) вы можете иметь свою последовательность с пустыми интервалами (после удаления) и неверной следующей автоинкрементной позицией . Попробуйте установить следующее значение автоинкремента в положение после наибольшего значения идентификатора:

ALTER SEQUENCE schema.entity_id_seq RESTART WITH 40072;
0
Zon