繁体   English   中英

错误:违反完整性约束:Hibernate中的NOT NULL检查约束

[英]Error: integrity constraint violation: NOT NULL check constraint in Hibernate

所以这是问题:

我有一个作为父类的ConfigGl​​obal类,并且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”或“ IDENTITY”会产生错误:

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

根据此Thread ,这里的问题是“每类表”继承和GenerationType.Auto。 并且它应该使用本线程中介绍的GenerationType.TABLE。在“每类表”策略中,每个类使用一个表,每个表都有一个ID。 要在继承层次结构中拥有唯一的ID(JPA要求),由于IDENTITY在一个表上工作,并且继承关系层次结构中现在有多个“根”表,因此无法使用TABLE_PER_CLASS和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;
    ...
}

但是现在这是我的问题:我有一个脚本,应该使用SQL查询将初始值插入ConfigGl​​obal表中。 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查询中的默认关键字更改为int(例如'1')时,此问题已解决,但由于许多配置值,并且以后很难维护,因此我不想手动递增ID。

我正在使用HSQL。

您建议我如何解决此问题?

非常感谢您的帮助。

您可以更改执行初始插入的查询,以增加每个新行的ID:

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

请注意,只有HSQLDB 2.2.x和更高版本才支持ROWNUM函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM