2014-09-05 178 views
0

在我的java中,我有一个泛型类(可以是抽象或非抽象的方式,但不映射到数据库中的表)。它有一个或多个变量,这对每个类都是通用的。示例:在Hibernate中继承映射策略

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

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

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

回答

0

问题table pet subclass多态性?父表包含commom列,子表的具体细节。

+0

每个子类的表似乎假定父类将在数据库中。但正如你在我的例子中看到的,父类不是一个实际的数据库对象。它是一个抽象类,它包含几个对所有具体类都通用的字段。它不映射到任何特定的表。 – pete 2014-09-05 20:35:11

+0

我想我可以改变数据库的结构,使其在表中保存父类。但是,这不需要每次我们想要访问任何物品的创建日期时进行内部连接吗? – pete 2014-09-05 21:23:54

+0

现在你让我困惑。你不想在每个表中重复同一列,你不想在同一个表中保存整个层次结构,并且你不希望分开保存公共列并进行连接?那么你究竟期待什么?无论如何,请阅读https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/inheritance.html,然后选择您的选项。 – kaqqao 2014-09-06 13:03:08

1

实际上是为你的用例,无可厚非使用Table per concrete class战略

你正在试图解决也没有创造在架构级别任何冗余(在创建表时)的问题。即使我们在反向模式下进行实体建模,也没有问题。事实上,create_date是每个表格的每行特定的。

Table per concrete class只有当您正在处理普通继承时,例如用户 - >客户 - >供应商,其中每个扩展类是一种父类,并且子类中添加的特定额外属性不需要重复所有表(对于这种情况推荐使用Join Table策略)