Java 如何在hibernate';每个类的表层次结构策略?

Java 如何在hibernate';每个类的表层次结构策略?,java,hibernate,table-per-hierarchy,Java,Hibernate,Table Per Hierarchy,我使用了hibernate的表,每个类的层次结构如下所述 我有一个简单的1层层次结构,父级包含许多属性,子级(ren)包含更多相同的属性。还有与对象的关系。例如: @Table(uniqueConstraints = { @UniqueConstraint(columnNames = {"name"}) }) @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name = "type", disc

我使用了hibernate的表,每个类的层次结构如下所述

我有一个简单的1层层次结构,父级包含许多属性,子级(ren)包含更多相同的属性。还有与对象的关系。例如:

@Table(uniqueConstraints = { @UniqueConstraint(columnNames = {"name"}) })
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING, length = 1)
abstract class X {
...
Long id;
String name;
List<A> a;
...
}
class Y extends X {
...
String getType() { return "Y"; }
...
}
class Z extends X {
...
String getType() { return "Z"; }
...
}
class A {}
@Table(uniqueConstraints={@UniqueConstraint(columnNames={“name”})})
@继承(策略=InheritanceType.SINGLE_表)
@鉴别器列(name=“type”,鉴别器类型=鉴别器类型.STRING,长度=1)
抽象类X{
...
长id;
字符串名;
清单a;
...
}
类Y扩展X{
...
字符串getType(){return“Y”;}
...
}
类Z扩展了X{
...
字符串getType(){return“Z”;}
...
}
A类{}

我需要做的是将一个持久化的Y实例“更新”为一个保持完整性的Z实例。如果我发出删除Y;创建Z时,我会遇到唯一的约束冲突(由于hibernate按照创建/更新顺序删除),但没有找到将Y“更新”为Z的策略。

AFAIK,如果不完全绕过会话,就无法做到这一点,因为这意味着Java对象将更改其具体类型,这是不可能的。即使如此,如果一个并发事务同时更新同一个实体,您最好使用乐观并发。如果另一个事务刷新实体或延迟加载实体,并且类型已更改,则会出现问题


简而言之,如果您需要这样做,这可能意味着您首先不应该拥有继承权。考虑将表映射为单个实体,使用类型列和可选字段。

我结束了更改层次结构,并使用子类型枚举来促进具体类之间的差异。