Ошибка postgres в пакетной вставке: отношение "hibernate_sequence" не существует. Позиция 17
Я выполняю пакетное обновление hibernate jpa и даю мне следующую ошибку
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"/>
Пожалуйста, предложите, что я делаю неправильно.
Ответы
Ответ 1
Попробуйте аннотировать ваш id
с помощью @Id
и @GeneratedValue(strategy=GenerationType.IDENTITY)
. Это работало для меня с PostgreSql.
UPDATE: он будет работать только в том случае, если столбец id объявлен как SERIAL
или BIGSERIAL
.
Ответ 2
Если вы не хотите изменять определение вашей сущности, вам нужно создать последовательность в вашей схеме postgreSQL с именем hibernate_sequence
.
CREATE SEQUENCE hibernate_sequence START 1;
UPDATE:
Вам не хватает второй последовательности generatef, которую вы определили для вашей сущности, просто добавьте ее, как и в предыдущей:
CREATE SEQUENCE my_seq_gen START 1;
Очень полезное руководство:http://www.concretepage.com/hibernate/generatedvalue-strategy-generationtype-sequence-hibernate
Ответ 3
Надеюсь, вы получите ответ, но если вы все еще находите ответ, это может быть полезно.
У меня была та же проблема и разрешила ее аннотировать метод getter идентификатора с @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;
}
Ответ 4
Можете ли вы попробовать следующее:
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "auto_gen")
@SequenceGenerator(name = "auto_gen", sequenceName = "A")
@Column(name = "ID")
private int id;
Спасибо
Ответ 5
У меня была одна и та же проблема. Я решил поставить auto increment на столбец id из таблицы на postgres, он работает, как это.
ALTER TABLE mytable ALTER COLUMN id SET DEFAULT nextval('mytable_id_seq');
ALTER SEQUENCE mytable_id_seq OWNED BY mytable.id;
Ответ 6
В моем случае добавление свойства name= "hibernate.hbm2ddl.auto" value = " обновление", решило проблему. Вы должны добавить указанное свойство в persistence.xml
Ответ 7
Согласно сообщению, 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;
Ответ 8
Иногда с аннотацией @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
вы можете иметь свою последовательность с пустыми интервалами (после удаления) и неверной следующей позицией автоинкремента. Попробуйте установить следующее значение автоинкремента в положение после наибольшего значения идентификатора:
ALTER SEQUENCE schema.entity_id_seq RESTART WITH 40072;
Ответ 9
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;