0

我有一个类似于以下结构的问题。

Entity Car 是一个抽象实体,可以派生为 CityCar、StationWagon、PickUp... - 每辆 Car 都有一个 Engine,它是 FuelEngine、DieselEngine、HybridEngine 等的抽象实体...

由于这是一个识别OneToOne关系,数据库设计将两个实体合并到同一个表中(我正在手动编写以下 SQL,我现在对 SQL 有点生疏)

CREATE TABLE CAR (
    ID UNSIGNED INT PRIMARY KEY,
    TYPE_OF_CAR CHAR,
    LICENSE_PLATE VARCHAR(...),
    ....
    ENGINE_TYPE CHAR,
    ENGINE_CYLINDRATE DECIMAL, //let's say doesn't apply to ENGINE_TYPE='ELECTRIC'
    ENGINE_KW_POWER DECIMAL(...) NOT NULL,
    ...
)

现在我想在 Hibernate 中映射它。我对Car类和子类的语法很有信心。目前,我的 POJO 如下所示:

@Entity
@Inheritance(SINGLE.TABLE)
@DiscriminatorColumn(TYPE_OF_CAR)
public class Car{

    private int id;

    ....

    private char engineType;
    private float engineCylindrate;

    ....

}

问题是:是否可以让 POJO 显示属性private Engine engine;而不是拥有所有 Engine 属性而没有单独的 Engines 表?Engine 类应该如何没有自己的表?

4

1 回答 1

2

附带说明一下,这样的数据库设计当然会导致大量的列,这些列大部分时间都是空值:所有其他汽车的皮卡的货物区域大小,所有行的电动机特定属性等.

数据库中的同一行无法匹配两个不同的 JPA 实体。因此,如果 Engine 也应该是实体,则需要单独的 Car 和 Engine 表。这也将导致更好的模型。

如果这不可行,还有其他方法。JPA 将属性分组到单独的类的方法是使用@Embeddable。因为 JPA 不支持嵌入的继承(至少规范中没有提到,Hibernate 不支持:HHH-1910),所以不能有引擎的子类型。如前所述,更好的解决方案是使用两个(至少)表。

于 2013-06-11T09:04:22.913 回答