NULL не допускается для столбца "ID" H2 Hibernate - PullRequest
0 голосов
/ 08 мая 2018

Я использую Java EE с Wildfly 12. У меня следующая схема таблицы SQL:

CREATE TABLE AUTHOR ("ID" INTEGER primary key, "FIRSTNAME" VARCHAR(50) not null, "SECONDNAME" VARCHAR(50) not null);
CREATE TABLE BOOK ("ID" INTEGER primary key, "TITLE" VARCHAR(50) not null, "AUTHOR" INTEGER, FOREIGN KEY ("AUTHOR") REFERENCES AUTHOR("ID"));

Я хочу выполнить следующую вставку:

INSERT INTO AUTHOR("SECONDNAME","FIRSTNAME") values ('a', 'b');
INSERT INTO BOOK("TITLE","AUTHOR") values ('bookTitle', 1);

My persistence.xml:

<property name="hibernate.hbm2ddl.auto" value="create-drop" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
<property name="javax.persistence.schema-generation.create-source" value="script"/>
<property name="javax.persistence.schema-generation.drop-source" value="script"/>
<property name="javax.persistence.schema-generation.create-script-source" value="META-INF/create.sql"/>
<property name="javax.persistence.schema-generation.drop-script-source" value="META-INF/drop.sql"/>
<property name="javax.persistence.sql-load-script-source" value="META-INF/load.sql"/>

Это работает, когда я явно вставляю ID. Однако идентификатор должен быть сгенерирован автоматически. Мои классы сущностей:

@Entity
@XmlRootElement
public class Author {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

// rest of fields, getters, and setters omitted

}

@Entity
@XmlRootElement
public class Book {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;
// Again, rest of the fields, getters and setters omitted
}

Я перепробовал все стратегии генерации (АВТО, ИДЕНТИЧНОСТЬ, ПОСЛЕДОВАТЕЛЬНОСТЬ). Как я уже сказал, если я явно устанавливаю идентификаторы в своем SQL, SQL работает, но я сталкиваюсь с той же проблемой при использовании entityManager.persist ...

@POST
@Path("/create")
public void createAuthor(Author author) {
    entityManager.persist(author);
}

Все вышеперечисленное дает мне:

Caused by: org.h2.jdbc.JdbcSQLException: NULL not allowed for column "ID"; SQL statement: ...

Любая помощь?

1 Ответ

0 голосов
/ 08 мая 2018

Вы только что указали, что столбец ID равен INTEGER и PRIMARY KEY. Вы никогда не устанавливали, что столбец должен иметь автоинкремент, поэтому сообщение об ошибке верно. Измените свой DDL на:

CREATE TABLE AUTHOR (
    "ID" INTEGER primary key auto_increment,
    "FIRSTNAME" VARCHAR(50) not null,
    "SECONDNAME" VARCHAR(50) not null
);

CREATE TABLE BOOK (
    "ID" INTEGER primary key auto_increment,
    "TITLE" VARCHAR(50) not null,
    "AUTHOR" INTEGER, FOREIGN KEY ("AUTHOR") REFERENCES AUTHOR("ID")
);
...