Так вот вопрос:Ошибка: целостность ограничение нарушение: NOT NULL ограничение проверки в Hibernate
У меня есть ConfigGlobal класс, который является родительским классом, и ConfigNetwork и ConfigProject продлить его. Они отмечены аннотацией спящего режима, так как я хочу таблицу базы данных для каждого из этих трех классов.
@Entity
@Table(name = "CONFIG_GLOBAL")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class ConfigGlobal implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
@Column(name = "CONFIG_ID")
private Long configId;
@OneToOne
@JoinColumn(name = "CONFIG_PROPERTY_ID")
private ConfigProperty configProperty;
@Column(name = "VALUE")
private String value;
public ConfigGlobal() {
}
public ConfigGlobal(ConfigProperty configProperty, String value) {
this.configProperty = Preconditions.checkNotNull(configProperty);
this.value = Preconditions.checkNotNull(value);
}
//getter and setter methods
}
Первоначальный вопрос был о том, что родительский класс должен иметь автоинкрементный первичный ключ, но с использованием GenerationType как «AUTO» или «Идентичность» дает ошибку:
Cannot use identity column key generation with <union-subclass> mapping for: com.db.model.ConfigGlobal
Согласно этому Thread, проблеме здесь - это наследование «table-per-class» и GenerationType.Auto. И он должен использовать GenerationType.TABLE, как объяснено в этом Thread В стратегии «таблица за класс» вы используете одну таблицу для каждого класса, и каждый имеет идентификатор. Чтобы иметь уникальные идентификаторы через иерархию наследования (что требуется JPA), это невозможно сделать с помощью TABLE_PER_CLASS и IDENTITY, поскольку IDENTITY работает с таблицей, и теперь в иерархии наследования есть несколько «корневых» таблиц ... Следовательно, это фиксируется с помощью GenerationType.TABLE вместо GenerationType.IDENTITY:
@Entity
@Table(name = "CONFIG_GLOBAL")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class ConfigGlobal implements Serializable {
...
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
@Column(name = "CONFIG_ID")
private Long configId;
...
}
Но вот мой вопрос прямо сейчас: у меня есть сценарий, который необходимо вставить начальные значения в таблицу ConfigGlobal с помощью SQL запроса. После того, как таблицы создаются Hibernate, я запускаю Maven для вставки значений при запуске (База данных пуста). Запрос SQL выглядит следующим образом:
insert into CONFIG_GLOBAL (CONFIG_ID, VALUE, CONFIG_PROPERTY_ID) values (default, 'all', (select CONFIG_PROPERTY_ID from CONFIG_PROPERTY where NAME='accept-connections-from'))
После его выполнения я получаю эту ошибку:
Error: integrity constraint violation: NOT NULL check constraint; SYS_CT_10093 table: CONFIG_GLOBAL column: CONFIG_ID
При изменении по умолчанию ключевого слова в запросе SQL к междунар (например, «1») проблема исправлено, но я не хочу вручную увеличивать идентификаторы, так как существует множество значений конфигурации, и в будущем их трудно поддерживать.
Я использую HSQL, кстати.
Что вы предлагаете, чтобы исправить эту проблему?
Настоятельно оцените вашу помощь.