Hibernate使用继承策略SINGLE_TABLE多次生成相同的外键约束

时间:2013-10-09 20:01:01

标签: java hibernate inheritance

我正在为两种类型的变量建模,称它们为AVarBVar。它们每个都可以分别与AValueBValue类型的多个值相关联。我决定使用继承,因此每个具体类都继承自抽象基类(Variable或Value)。

然后我从抽象值到抽象变量有一个ManyToOne映射。对于Variable我正在使用SINGLE_TABLE继承。对于Value,我使用的是TABLE_PER_CLASS继承。 Hibernate支持所有这些并生成表格,但是,我得到相同的外键约束3次,这是双重冗余。我的设置有问题,还是这是一个Hibernate错误?

Hibernate架构更新的输出:

HHH000262: Table not found: dm_variables
HHH000262: Table not found: dm_variables_a_values
HHH000262: Table not found: dm_variables_b_values

create table dm_variables (type varchar(31) not null, id varchar(36) not null, version bigint not null, name varchar(255) not null, variable_set_id varchar(36) not null, primary key (id), unique (variable_set_id, name))
create table dm_variables_a_values (id varchar(36) not null, version bigint not null, [current] bit not null, variable_id varchar(36) not null, member_id int, primary key (id))
create table dm_variables_b_values (id varchar(36) not null, version bigint not null, [current] bit not null, variable_id varchar(36) not null, string_value varchar(255), primary key (id))

alter table dm_variables_a_values add constraint FK__dm_values__variable_id90d2dd34 foreign key (variable_id) references dm_variables
alter table dm_variables_a_values add constraint FK7ED02C351F5CFA0E90d2dd34 foreign key (variable_id) references dm_variables
alter table dm_variables_a_values add constraint FK7ED02C35F9E9BFC090d2dd34 foreign key (variable_id) references dm_variables
alter table dm_variables_b_values add constraint FK__dm_values__variable_id5135dfd4 foreign key (variable_id) references dm_variables
alter table dm_variables_b_values add constraint FK7ED02C351F5CFA0E5135dfd4 foreign key (variable_id) references dm_variables
alter table dm_variables_b_values add constraint FK7ED02C35F9E9BFC05135dfd4 foreign key (variable_id) references dm_variables

HHH000232: Schema update complete

代码(简化):

@Entity
@Table(name = "dm_variables")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type")
public abstract class Variable extends BaseEntity {
}

@Entity
@DiscriminatorValue(value = "A")
public class AVar extends Variable {
}

@Entity
@DiscriminatorValue(value = "B")
public class BVar extends Variable {
}

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Value extends BaseEntity {

    @ManyToOne
    @JoinColumn(name = "variable_id", nullable = false)
    @ForeignKey(name = "FK__dm_values__variable_id")
    private Variable variable;
}

@Entity
@Table(name = "dm_variables_a_values")
public class ValueA extends Value {
}

@Entity
@Table(name = "dm_variables_b_values")
public class ValueB extends Value {
}

1 个答案:

答案 0 :(得分:0)

我认为这不是一个真正的错误。我同意这不是最佳的,但这种行为不会产生太多后果。特别是:

  • 约束违规错误消息包含您使用@Constraint
  • 指定的约束名称
  • 我们可以预期,在运行时,会按顺序评估约束,一旦违反了一个约束,就不会评估其他约束。

此外,shema-update功能不是框架的核心功能(即使它被广泛使用且功能强大),我认为这种行为不会破坏 schema-update 合同。在我看来,这可能是一个小小的改进。