使用休眠在 JPA 中映射摘要(super class)和 subclass
Mapping Abstract (super class) and subclass in JPA using hibernate
我有一个Abstract class product和三个sub classes Honey, Wax 和 Misc。根据定义,sub classes 扩展了 Product class 并添加了一些额外的字段。我正在使用 JPA 注释来执行映射。 classes 如下所示。
Product.java
@MappedSuperclass
public abstract class Product implements Comparable<Product> {
private static long currentId =1;
@Id
@Column(name="ID", nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Column(name="name")
private String name;
@Column(name="description")
private String description;
@Column(name="price")
private double price; // in euro, internationalization can come later
protected String productType;
Honey.java
@Entity
public class Honey extends Product {
@Column(name="expiryDate")
private Date expiryDate;
@ManyToOne
@JoinColumn(name="source")
private Flower source;
Wax.java
import javax.persistence.Entity;
@Entity
public class Wax extends Product {
Miscellaneous.java
@Entity
public class Miscellaneous extends Product {
@Column(name="expireDate")
private Date expireDate;
@Column(name="areaOfApplication")
private String areaOfApplication;
结果是我在数据库中创建了三个不同的 table。但我的问题是,如果我想获得所有可用的产品,那么我的猜测是我将不得不查询三个不同的 table。这种方法对我来说似乎不对。正确的方法不应该是我应该有一个产品 table,其中列出了所有产品吗?但是每个产品可以属于不同的类别(蜂蜜、蜡或杂项),这意味着不同的列并且可以包含空值。
有人可以请教我这个吗?非常感谢。
将 MappedSuperclass 更改为定义适当继承策略的抽象实体应该可以解决问题。在您的情况下,带有鉴别器列的单个 table 将是正确的继承选择。您甚至应该能够查询抽象超类,以便在结果集中获取所有匹配的子类。
我有一个Abstract class product和三个sub classes Honey, Wax 和 Misc。根据定义,sub classes 扩展了 Product class 并添加了一些额外的字段。我正在使用 JPA 注释来执行映射。 classes 如下所示。
Product.java
@MappedSuperclass
public abstract class Product implements Comparable<Product> {
private static long currentId =1;
@Id
@Column(name="ID", nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Column(name="name")
private String name;
@Column(name="description")
private String description;
@Column(name="price")
private double price; // in euro, internationalization can come later
protected String productType;
Honey.java
@Entity
public class Honey extends Product {
@Column(name="expiryDate")
private Date expiryDate;
@ManyToOne
@JoinColumn(name="source")
private Flower source;
Wax.java
import javax.persistence.Entity;
@Entity
public class Wax extends Product {
Miscellaneous.java
@Entity
public class Miscellaneous extends Product {
@Column(name="expireDate")
private Date expireDate;
@Column(name="areaOfApplication")
private String areaOfApplication;
结果是我在数据库中创建了三个不同的 table。但我的问题是,如果我想获得所有可用的产品,那么我的猜测是我将不得不查询三个不同的 table。这种方法对我来说似乎不对。正确的方法不应该是我应该有一个产品 table,其中列出了所有产品吗?但是每个产品可以属于不同的类别(蜂蜜、蜡或杂项),这意味着不同的列并且可以包含空值。
有人可以请教我这个吗?非常感谢。
将 MappedSuperclass 更改为定义适当继承策略的抽象实体应该可以解决问题。在您的情况下,带有鉴别器列的单个 table 将是正确的继承选择。您甚至应该能够查询抽象超类,以便在结果集中获取所有匹配的子类。