使用TABLE_PER_CLASS继承策略在JPA模式上存储子实体时写入父实体的策略

时间:2016-09-26 14:33:43

标签: java hibernate jpa persistence

@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
父类中的

允许将子实体视为具有与父项相同的信息的表加上一些属性。阅读时(http://viralpatel.net/blogs/hibernate-inheritance-table-per-concrete-class-annotation-xml-mapping/),这对我来说很好。

但我希望如果我存储子实体(目前它只填充子表),父表也会随着共享部分的插入而更新。

是否可以配置,或者我是否需要在任何给定的写操作中在事务中显式执行childRepo.save(child)parentRepo.save(child)

这将是TABLE_PER_CLASS和JOINED策略的混合。 JOINED在父级中存储共享信息,而在子级中存储额外的属性;而TABLE_PER_CLASS将所有内容存储在子代中。我希望子表包含所有信息,而父表也同步获得所有共享信息。

2 个答案:

答案 0 :(得分:0)

有3种继承策略:SINGLE_TABLE,JOINED和TABLE_PER_CLASS。 -TABLE_PER_CLASS:将每个实体映射到一个表 -SINGLE_TABLE:父实体和子项将只映射到一个表(在DB中,只有一个表用于整个继承层次结构)。 -JOINED:这是你需要的,共享属性将保存在父表中,子相对属性将保存在子表中

答案 1 :(得分:0)

添加到3个继承策略中:SINGLE_TABLE,TABLE_PER_CLASS和JOINED。 谈到insert,table_per_class在同一个表上有不同的插入查询但是有不同的鉴别器值。对于每个备用列,表也将具有空值,已设置鉴别符。选择也将是独立的。如果使用union子类,则使用union的单个select查询。 在Joined strategy中,每个父表和子表都有两个插入。使用子表左外连接和子表完成选择。

因此,如果你想使用table_per_class,你可以使用每个子类的union和生成器类作为赋值,多态性值作为隐式或join-sub-class。