2016-08-08 20 views
0

Also hier ist die Frage:Fehler: Integrität Einschränkungsverletzung: NOT NULL Check-Einschränkung in Hibernate

ich eine ConfigGlobal Klasse, die eine übergeordnete Klasse ist, und ConfigNetwork und ConfigProject es erweitern. Sie sind durch Hibernate Annotation markiert, da ich eine Datenbanktabelle für jede dieser drei Klassen haben möchte.

@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 

} 

Die erste Problem war, dass die übergeordnete Klasse eine Autoincrement Primärschlüssel sollte aber Generation als „AUTO“ oder „Identität“ gibt Fehler mit:

Cannot use identity column key generation with <union-subclass> mapping for: com.db.model.ConfigGlobal 

Nach dieser Thread, das Problem hier ist das "Tabelle-pro-Klasse" Vererbung und GenerationType.Auto. Und es sollte GenerationType.TABLE verwenden, wie in dieser Thread In einer "Tabelle-pro-Klasse" -Strategie verwenden Sie eine Tabelle pro Klasse und jeder hat eine ID. Um eindeutige IDs über eine Vererbungshierarchie (die JPA erfordert), kann es nicht mit TABLE_PER_CLASS und IDENTITY getan werden, da IDENTITY arbeitet eine Tabelle, und es gibt jetzt mehrere "root" -Tabellen in der Vererbungshierarchie ... Daher ist dies Fest von GenerationType.TABLE statt GenerationType.IDENTITY mit:

@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; 
    ... 
} 

Aber hier ist mein Problem jetzt: ich habe ein Skript, das Anfangswert in die ConfigGlobal Tabelle mit SQL-Abfrage einfügen sollte. Nachdem die Tabellen von Hibernate erstellt wurden, starte ich Maven, um die Werte beim Start einzufügen (Datenbank ist leer). Die SQL-Abfrage ist wie folgt:

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')) 

Nach dem Ausführen ich diesen Fehler:

Error: integrity constraint violation: NOT NULL check constraint; SYS_CT_10093 table: CONFIG_GLOBAL column: CONFIG_ID 

Wenn ich Standard-Schlüsselwort in der SQL-Abfrage in einen int ändern (zB ‚1‘) ist das Problem behoben, aber ich möchte die IDs nicht manuell erhöhen, da es viele Konfigurationswerte gibt, die in Zukunft schwer zu pflegen sind.

Ich benutze HSQL übrigens.

Was schlagen Sie vor, um dieses Problem zu beheben?

Wirklich zu schätzen Ihre Hilfe.

Antwort

0

Sie können die Abfrage ändern, die die anfängliche Einlage führt die ID für jede neue Zeile zu erhöhen:

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

Beachten Sie, dass die ROWNUM Funktion nur von HSQLDB 2.2.x und höher unterstützt.