2016-08-08 4 views
0

Так вот вопрос:Ошибка: целостность ограничение нарушение: 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, кстати.

Что вы предлагаете, чтобы исправить эту проблему?

Настоятельно оцените вашу помощь.

ответ

0

Вы можете изменить запрос, который выполняет начальную вставку для увеличения идентификатора для каждой новой строки:

insert into CONFIG_GLOBAL (CONFIG_ID, VALUE, CONFIG_PROPERTY_ID) 
    select ROWNUM(), 'all', CONFIG_PROPERTY_ID from CONFIG_PROPERTY where NAME ='accept-connections-from'; 

Обратите внимание, что функция ROWNUM поддерживается только с помощью HSQLDB 2.2.x и более поздних версий.

 Смежные вопросы

  • Нет связанных вопросов^_^