在我的java中,我有一个泛型类(可以是抽象的,也可以是非抽象的,但不映射到数据库中的表)。它有一个或多个每个类都通用的变量。示例:
public class GenericThing {
private Date createDate;
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date dt) {
createDate = dt;
}
}
这很有用,因为实际上数据库中的每个表都有CREATE_DATE列。
在这种情况下,Hibernate中使用的正确继承策略是"每个具体类的表"。但是,他们说,这是"糟糕的",因为每个表都需要相同的列,如果您更改该列名(CREATE_DATE),则必须更改每个表的列名。很明显,这是真的,但还有什么选择呢?显然,我确实希望数据库中的每个表都存储创建日期,但我不希望整个数据库中的每一个对象都在一个表中,这样就排除了(据我所知)所有其他映射策略,对吧?
实际上,对于您的用例,使用Table per concrete class
策略没有错
您试图解决的问题不是在架构级别(创建表时)创建任何冗余。即使我们以反向模式进行实体建模,这也是可以的。事实上,create_date特定于每个表的每一行。
仅当您处理正常继承时,不建议使用Table per concrete class
,例如User->Customer->Supplier,其中每个扩展类都是一种父类,并且在子类中添加的特定额外属性不需要在所有表中重复(对于这种情况,建议使用Join-Table策略)
表宠物子类多态性出了什么问题?父表包含命令列,子表包含细节。