使用hibernate在JPA中映射Abstract(超类)和子类

时间:2015-02-05 19:18:04

标签: hibernate jpa mappedsuperclass

我有一个Abstract class product 和三个子类 Honey Wax Misc 。根据定义,子类扩展Product类并添加一些额外的字段。我正在使用JPA注释来执行映射。课程如下。

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;

结果是我在DB中创建了三个不同的表。但我的问题是,如果我想获得所有可用的产品,那么我的猜测是我将不得不查询三个不同的表。这种方法对我来说似乎不对。我应该有一个正确的方法,我应该有一个产品表,列出所有产品?但是每个产品可以是不同的类别(蜂蜜,蜡或其他),这意味着不同的列,可以包含空值。

有人可以赐教我这个吗?非常感谢。

1 个答案:

答案 0 :(得分:1)

将MappedSuperclass更改为定义正确继承策略的抽象实体应该可以解决问题。在您的情况下,带有鉴别器列的单个表将是正确的继承选择。您甚至应该能够查询抽象超类,以便在结果集中获取所有匹配的子类。