【问题标题】:Error: integrity constraint violation: NOT NULL check constraint in Hibernate错误:违反完整性约束:Hibernate 中的 NOT NULL 检查约束
【发布时间】:2016-12-13 17:33:11
【问题描述】:

那么问题来了:

我有一个 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,这里的问题是“table-per-class”继承和GenerationType.Auto。它应该使用 GenerationType.TABLE 如Thread 中所述 在“每类表”策略中,每个类使用一个表,每个表都有一个 ID。要通过继承层次结构(JPA 要求)获得唯一 id,不能使用 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;
    ...
}

但现在我的问题是:我有一个脚本,它应该使用 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。

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

非常感谢您的帮助。

【问题讨论】:

    标签: java hibernate hsqldb


    【解决方案1】:

    您可以更改执行初始插入的查询以增加每个新行的 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';
    

    请注意,ROWNUM 函数仅受 HSQLDB 2.2.x 及更高版本支持。

    【讨论】:

      猜你喜欢
      • 2017-03-01
      • 2014-11-27
      • 2015-11-01
      • 2020-10-02
      • 2018-03-20
      • 2021-06-10
      • 2021-03-24
      • 1970-01-01
      • 2019-07-27
      相关资源
      最近更新 更多