四处走走"每个混凝土类别的表格"在Hibernate继承映射策略中

时间:2014-09-05 18:56:08

标签: java hibernate inheritance

在我的java中,我有一个泛型类(无论是抽象的还是非抽象的,但不会映射到数据库中的表)。它有一个或多个每个类共有的变量。示例:

public class GenericThing {
    private Date createDate;
    public Date getCreateDate() {
        return createDate;
    }
    public void setCreateDate(Date dt) {
        createDate = dt;
    }
}

这很有用,因为数据库中的每个表都有CREATE_DATE列。

在这种情况下,在Hibernate中使用的正确继承策略是“每个具体类的表”。但是,他们说,这是“糟糕的”,因为每个表都需要相同的列,如果更改了该列名(CREATE_DATE),则必须更改每个表的列名。嗯,显然这是真的,但是替代方案是什么?显然我确实希望数据库中的每个表都存储创建日期,但我不希望整个数据库中的每个对象都在一个表中,因此排除(据我所知)所有其他映射策略,对?

2 个答案:

答案 0 :(得分:1)

实际上,对于您的用例,使用Table per concrete class策略

没有错

您尝试解决的问题是在架构级别创建任何冗余(创建表时)。即使我们以反向模式进行实体建模,这也没关系。事实上,create_date特定于每个表的每一行。

仅当您处理正常继承时,不建议使用

Table per concrete class,例如User - >客户 - >供应商,其中每个扩展类是一种父类,并且子类中添加的特定额外属性不需要在所有表中重复(对于这种情况,建议使用连接表策略)

答案 1 :(得分:0)

table pet subclass 多态性有什么问题?父表包含commom列,子表是具体的。