У меня есть столбец я бы и столбец должность в таблице postgresql. Я хочу, чтобы позиция была автоинкрементной, поэтому я добавил должность, используя тип данных сериал:
ALTER TABLE tbl ADD COLUMN position serial;
id name position
------- ------- -------
1 S4 4
2 S2 2
3 S3 3
4 S1 1
Проблема в том, что когда я пытаюсь создать новый объект, у меня возникает следующая ошибка:
org.postgresql.util.PSQLException: error: PSQLException: ERROR: null value in column "position" violates not-null
Что мне нужно сделать, чтобы установить автоматическое увеличение столбца должность?
Мой простой объект:
public class Stg {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
@SequenceGenerator(name = "sequenceGenerator")
private Long id;
@NotNull
@Size(max = 20)
@Column(name = "name", length = 20, nullable = false)
private String name;
private Integer position;
@TimBiegeleisen 10.1
Каково ваше утверждение INSERT?
Само по себе ваше заявление alter не должно вызывать эту ошибку, насколько я знаю.
Значения @404, которые я помещаю в оператор, выглядят так (5, S5, null), поэтому позиция явно нулевая, однако у меня нет этой проблемы с идентификатором - он генерируется
@TimBiegeleisen должен ли я использовать какую-либо аннотацию в своем объекте?
@Bob, если вы укажете NULL для ввода этого столбца, вы получите эту ошибку. Вам нужно сделать что-то вроде INSERT INTO table (id, name) VALUES (5, 'S5'); — игнорируя столбец position, который затем получит значение по умолчанию из последовательности. Я не могу комментировать, как вы это делаете с точки зрения Java, но именно так вы делаете это в PG.
@404 Я не устанавливаю значение в поле Я БЫ, и оно генерируется правильно, и здесь похоже, что я поставил null
ID не имеет значения, дело в том, что вы не можете установить NULL для position, потому что определение его как SERIAL означает, что он одновременно получает ограничение NOT NULL и значение по умолчанию NEXTVAL(your_sequence). Если вы укажете NULL для значения этого столбца, произойдет сбой из-за ограничения. Таким образом, вам нужно либо указать значение вручную - и в этом случае вы не должны были определять его как SERIAL - либо вы вообще не указываете этот столбец в своем INSERT, и в этом случае он будет автоматически использовать последовательность для получения автоматического увеличивающееся значение.




1. Вам нужно создать последовательность:
CREATE SEQUENCE sys_sequence_name START -9223372036854775808 MINVALUE -9223372036854775808 MAXVALUE 9223372036854775807;
Затем создайте таблицу, но после объявления параметра строки добавьте
CREATE TABLE table_name (
id bigserial primary key,
var_with_seq bigint not null default nextval('sys_sequence_name')
nextval('sys_sequence_name') - будет использоваться созданная вами последовательность.
Должен ли я добавить некоторую аннотацию к полю должность в классе Стг?
Вы можете добавить выше частную целочисленную позицию @SequenceGenerator(name = "sys_sequence_name")
И обязательно добавьте @GeneratedValue(strategy=GenerationType.SEQUENCE,generator = "sys_sequence_name")
Я пробовал раньше с этой аннотацией, но она не работает. Последовательность в postgres работает хорошо, но java все еще пытается поместить значение null в позицию
хм, попробуйте добавить в аннотацию @SequenceGenerator(name = "sys_seq_position_name", sequenceName = "sys_sequence_name",allocationSize = 1) @GeneratedValue(strategy=GenerationType.SEQUENCE,generator = "sys_sequence_position_name") @Column(name= "position", insertable=false) частная длинная позиция
Я смотрел ту же тему, я думаю - не работает для меня. Когда я удаляю поле должность из класса, оно работает нормально, поэтому aut-increment работает хорошо, но java strill пытается поместить значение null в позицию.
Спроси наверняка. У вас есть @Entity и @Table(name = "table_name_in_db") выше класса?
Тогда не знаю, сори.
Какая у вас версия Постгреса?