如何在hibernate的table-per-class-hierarchy策略中更新具体类?

时间:2012-01-24 18:21:48

标签: java hibernate table-per-hierarchy

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

我有一个简单的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的策略。

1 个答案:

答案 0 :(得分:2)

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

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