实体列表创建一个单独的表,而不是包含在实体本身

时间:2017-06-09 14:38:36

标签: java mysql entity-framework hibernate jpa

当我将一个汽车列表作为一个名为“Loaner Car”的实体的属性,并且该关系是一对多的称为“汽车”的父类,它创建了一个单独的表而不是将其持久化为一个实体。我知道mysql是一个单键和单值数据库,因此它可以采用复杂的结构,如列表。我尝试使用@Embeddable,但由于我有一个Automobiles列表,它是LoanerCar的父类,它阻止我将子类嵌入子类中。我能为此做点什么吗? 这是我的代码......

Automobile.java

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.OneToOne;

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class Automobile implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long Id;

    @OneToOne
    private Manufacturer manufacturer;

    @OneToOne
    private AutomobileType autotype;

    @OneToOne
    private LoanerCar loanerCarID;

    private String vin;

    //Getters and Setters, No-Arg Constructor, etc..
}

LoanerCar.java

import java.sql.Timestamp;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.OneToMany;

@Entity
public class LoanerCar extends Automobile{

    private static final long serialVersionUID = 1L;

    private String name;

    private Timestamp dateLoaned;

    private Timestamp dateReceived;

    @OneToMany
    private List<Automobile> alist;

    //Getters and Setters, No-Arg Constructor, etc.
    }

TotaledCar.java

import java.util.List;

import javax.persistence.Entity;
import javax.persistence.OneToMany;

@Entity
public class TotaledCar extends Automobile {

    private static final long serialVersionUID = 1L;

    @OneToMany
    private List<LoanerCar> eligibleLoaners;

    //Getters and Setters, No-Arg Constructor, etc..

}

执行此代码后,表的输出显示此...

Output of Tables created

它为实体的列表元素“TotaledCar”和“LoanerCar”创建一个表。我希望TotaledCar表中的每一行都有一个元素列表。基于该行,我可以检索,更新,在该列表中添加值。但主要的是每个实体的所有属性都被分组到相应的表中。

1 个答案:

答案 0 :(得分:0)

让我们在这里讨论两件事情,因为你的问题很模糊,我想确保我们澄清两者,以防你的困惑与其中一方或两方都混淆。

继承

您的实体设置是使用实体继承的设置。你基本上已经说过你有一个名为Automobile的抽象基类和两个名为TotaledCarLoanerCar的专业。每个实体类型都包含子类继承的一系列属性。

问题是如何在数据库级别对此进行建模。

您现有的代码使用JOINED策略,这意味着每个实体的属性将分布在每个实体类型的表中,因此最终会得到AutomobileTotaledCar的表格,和LoanerCar

从设计的角度来看,这可能不一定是一个糟糕的选择。在介绍其他类型后,我会解释更多原因。

另一种选择是SINGLE_TABLE策略。在这种情况下,您最终会得到一个名为Automobile的表,其中所有基本类型的属性都存储在一行中。我明确提到基本类型,因为我不是在谈论关联,标记为...ToMany的关联。我们稍后也会介绍这些内容。

另一种选择是TABLE_PER_CLASS策略。在这种情况下,您最终会得到每个汽车类型的表格,但不是在Automobile这样的单独表格中共享JOINED的常用属性,而是最终会复制这些列中的列。每个具体的子类。因此,您会在VINTotaledCar中看到LoanerCar列。

选择使用哪种策略高度依赖于您的应用程序的需求以及您将要处理的数据量。使用JOINED,您可以消除使用SINGLE_TABLE时存储的任何潜在开销,但是您会在查询时产生加入费用。对于TABLE_PER_CLASS,您可以避免加入成本和存储开销,并在继承的代码级别获得所有好处。

协会

根据关联映射,有时会将关联内联(附加)到实体的表中。这些是@OneToOne@ManyToOne等映射。对于这些情况,关联实体的主键将作为列存储在当前表中。

对于@OneToMany,关联实体类型通常拥有关联,因此将是管理与当前实体的外键关系的表。但是,您可以使@OneToMany个关联拥有该关系,在这些情况下,您可以使用连接表执行此操作。

对于@ManyToMany,实体表都不会内联关系。此映射表将需要使用连接表,该连接表将每个实体类型的主键存储为每个条目的单行。

对于@ElementCollection,这些也将在连接表中进行管理。