Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate使用继承策略SINGLE_表多次生成相同的外键约束_Java_Hibernate_Inheritance - Fatal编程技术网

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

Java Hibernate使用继承策略SINGLE_表多次生成相同的外键约束,java,hibernate,inheritance,Java,Hibernate,Inheritance,我正在对两种类型的变量进行建模,称它们为AVar,和BVar。它们各自可以与多个值关联,分别为AValue和BValue类型。我决定使用继承,这样每个具体类都从抽象基类(变量或值)继承 然后我有一个从抽象值到抽象变量的manytone映射。对于变量,我使用的是SINGLE_TABLE继承。对于值,我使用了TABLE\u PER\u类继承。Hibernate支持所有这些,并且可以很好地生成表,但是,我得到了3次相同的外键约束,这是双重冗余的。我的设置是否有问题,或者这是一个休眠错误 Hiberna

我正在对两种类型的变量进行建模,称它们为
AVar
,和
BVar
。它们各自可以与多个值关联,分别为
AValue
BValue
类型。我决定使用继承,这样每个具体类都从抽象基类(变量或值)继承

然后我有一个从抽象值到抽象变量的manytone映射。对于变量,我使用的是
SINGLE_TABLE
继承。对于值,我使用了
TABLE\u PER\u类
继承。Hibernate支持所有这些,并且可以很好地生成表,但是,我得到了3次相同的外键约束,这是双重冗余的。我的设置是否有问题,或者这是一个休眠错误

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
代码(简化):


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

  • 约束冲突错误消息包含您用@constraint指定的约束名称
  • 我们可以预期,在运行时,约束是按顺序计算的,一旦一个约束被违反,另一个约束就不会被计算

此外,shema更新特性不是框架的核心特性(即使它被广泛使用且功能强大),我不认为这种行为破坏了模式更新契约。在我看来,这可能是一个小小的改进。

在模式更新之后,在dm_variables_a_值中有多少约束?我得到了3个约束,说明了同样的问题。“外键(变量id)引用dm_变量”。您可以在Hibernate的原始问题的输出中看到这一点。您发布的是架构更新脚本,我只是想知道这3个约束是否是在脚本执行后创建的。当尝试插入违反约束的行时,您会收到什么消息?(您必须具有ConstraintViolationException,但异常消息中显示的约束名称是什么?)我明白您的意思。是的,所有6个约束都已创建。这是在SQL Server中,我想它允许这样的冗余约束。我得到的消息是“INSERT语句与外键约束“FK_udm_values_uvariable_id90d2dd34”冲突。冲突发生在数据库“dbo.dm_variables”表“id”列中。我最终发现,对于我的特定业务案例,这种关系并不十分准确。修改它消除了这种行为。你是对的,它是无害的,但是,我仍然认为它是一个bug。:)
@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 {
}