如何在休眠的每类表层次结构策略中更新具体类?



我已经使用了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 {}

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

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

简而言之,如果你需要这样做,这可能意味着你一开始就不应该有继承权。考虑将表映射为单个实体,其中包含一个类型列和可选字段。

最新更新