使用休眠在 JPA 中映射摘要(super class)和 subclass

Mapping Abstract (super class) and subclass in JPA using hibernate

我有一个Abstract class product和三个sub classes Honey, WaxMisc。根据定义,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 将是正确的继承选择。您甚至应该能够查询抽象超类,以便在结果集中获取所有匹配的子类。