0

我已经使用了 hibernate 的 table-per-class-hierarchy ,如此所述。

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

@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,我得到唯一的约束违规(由于休眠的删除顺序遵循创建/更新),但没有找到将 Y“更新”到 Z 的策略。

4

1 回答 1

2

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

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

于 2012-01-24T18:32:33.273 回答