所以这就是问题所在:
我有一个ConfigGlobal类是父类,ConfigNetwork和ConfigProject扩展它。它们由hibernate注释标记,因为我想要这三个类中的每一个都有一个数据库表。
@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,如此Thread中所述 在“每类表”策略中,每个类使用一个表,每个表都有一个ID。要通过继承层次结构(JPA需要)来获取唯一ID,因为IDENTITY无法使用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查询将初始值插入ConfigGlobal表。在Hibernate创建表之后,我运行Maven在start时插入值(Database为空)。 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查询中的default关键字更改为int(例如“1”)时问题得到解决,但我不想手动增加ID,因为有很多配置值,并且将来很难维护。
我正在使用HSQL。
您建议我采取哪些措施来解决此问题?
非常感谢您的帮助。
答案 0 :(得分:0)
您可以更改执行初始插入的查询,以增加每个新行的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功能。