Java 实体列表创建一个单独的表,而不是包含在实体本身中
当我将一个汽车列表作为一个名为“Loaner Car”的实体的属性,并且与它的父类“Automobile”是一对多的关系时,它会创建一个单独的表,而不是将其作为一个实体持久化。我知道mysql是一个单键单值数据库,所以它有可能采用复杂的结构,比如列表。我尝试过使用@Embeddeble,但是因为我有一个汽车列表,这是LoanerCar的父类,它阻止我在子类中嵌入父类。有什么我能做的吗? 这是我的密码 Automobile.javaJava 实体列表创建一个单独的表,而不是包含在实体本身中,java,mysql,entity-framework,hibernate,jpa,Java,Mysql,Entity Framework,Hibernate,Jpa,当我将一个汽车列表作为一个名为“Loaner Car”的实体的属性,并且与它的父类“Automobile”是一对多的关系时,它会创建一个单独的表,而不是将其作为一个实体持久化。我知道mysql是一个单键单值数据库,所以它有可能采用复杂的结构,比如列表。我尝试过使用@Embeddeble,但是因为我有一个汽车列表,这是LoanerCar的父类,它阻止我在子类中嵌入父类。有什么我能做的吗? 这是我的密码 Automobile.java import java.io.Serializable; im
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..
}
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.
}
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..
}
LoanerCar.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..
}
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.
}
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..
}
导入java.sql.Timestamp;
导入java.util.List;
导入javax.persistence.Entity;
导入javax.persistence.OneToMany;
@实体
公共级房车扩展汽车{
私有静态最终长serialVersionUID=1L;
私有字符串名称;
私人时间戳日期借出;
私有时间戳dateReceived;
@独身癖
私人名单
它为实体的列表元素“TotaledCar”和“LoanerCar”创建一个表我希望TotaledCar表中的每一行都有一个元素列表。基于该行,我可以在该列表中检索、更新和添加一个值。但最重要的是,每个实体的所有属性都要分组到相应的表中。鉴于您的问题是多么模糊和复杂,让我们在这里讨论两件事我想确保我们澄清这两个问题,以防你对其中一个或另一个甚至两者都感到困惑
继承权
您的实体设置是使用实体继承的。您基本上说过您有一个名为Automobile
的抽象基类和两个名为TotaledCar
和LoanerCar
的专门化。这些实体类型中的每一个都包含子类继承的一系列属性
问题是如何在数据库级别对此进行建模
您现有的代码使用了JOINED
策略,这意味着每个实体的属性将分布在每个实体类型的一个表中,因此您最终得到了Automobile
、TotaledCar
和LoanerCar
的一个表
从设计的角度来看,这不一定是一个坏的选择。在介绍其他类型之后,我将进一步解释原因
另一种选择是SINGLE_TABLE
策略。在这种情况下,您可能会得到一个名为Automobile
的表,其中所有basic类型的属性都存储在一行中。我明确提到基本类型,因为我不是在谈论关联,那些标记为…ToMany
。我们将以后也会有
另一种选择是TABLE\u PER_CLASS
strategy。在这种情况下,您最终会得到每个汽车类型的一个表,但不是像JOINED
那样在单独的表中共享automobile
的公共属性,而是在每个具体的子类中复制这些列。因此,您将看到TotaledCar
和LoanerCar
中的VIN
列
使用哪种策略的选择在很大程度上取决于应用程序的需要和要处理的数据量。使用连接可以消除使用单个表时可能产生的存储开销,但在查询时会产生连接成本。对于每个类的表,可以避免连接-成本和存储开销,并通过继承在代码级别获得所有好处
关联
根据关联映射,在某些情况下关联将与实体的表内联(附加)。这些是映射,例如@OneToOne
和@ManyToOne
。对于这些情况,关联实体的主键将存储为当前表中的列
对于@OneToMany
,关联的实体类型通常拥有关联,因此将是管理与当前实体的外键关系的表。但是,您可以使@OneToMany
关联拥有该关系,在这些情况下,您可以使用联接表来实现这一点
对于@manytomy
,两个实体表都不会内联关系。此映射表将需要使用联接表,该联接表将每个实体类型的主键存储为每个条目的一行
对于@ElementCollection
,它们也将在联接表中进行管理