基于列值检索子类的集合

时间:2010-11-10 21:30:28

标签: java hibernate subclass superclass hibernate-annotations

标题有点奇怪,所以让我澄清一下。

我有两个对象,车库和车辆,一对多的关系。有多种类型的车辆,例如汽车和卡车;该类型在Vehicle表中保持为字符串。

这是两个类:

@Entity
@Table(...)
public class Garage {
    ....

    @Column(name = "garageId")
    private Integer garageId;

    @OneToMany
    @JoinColumn(name = "garageId")
    private Set<Vehicle> vehicles;

    ....
}

@Entity
@Table(...)
public class Vehicle {
    ....

    @Column(name = "garageId")
    private Integer garageId;

    //could be "Truck" or "Car"
    @Column(name = "type")
    private String type;

    ....
}

为了区分车辆类型,目前我们必须查看类型列并使用枚举。我想做的是拥有Vehicle的子类,例如Car和Truck,来表示不同的类型,而不是依赖于Type字段。然后我的代码可以instanceof来确定类型,而不是使用该字段。

但是,我不知道如何告诉Hibernate如何根据Type列的值实例化子类,或者它是否可以。

我很感激你们给予的任何帮助。提前谢谢!

1 个答案:

答案 0 :(得分:1)

如果要保存当前数据库架构,则需要使用SINGLE_TABLE继承策略并将type列作为鉴别器:

@Entity 
@Table(...) 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type")
public abstract class Vehicle { ... }

@Entity
@DiscriminatorValue("...")
public class Car extends Vehicle { ... }

@Entity
@DiscriminatorValue("...")
public class Truck extends Vehicle { ... }