Получить коллекцию подклассов на основе значения столбца

Название немного странное, поэтому позвольте мне уточнить.

У меня есть два объекта, Garage и Vehicle, в отношениях "один ко многим". Есть несколько типов транспортных средств, таких как легковые и грузовые автомобили; тип сохраняется как строка в таблице 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, как создавать экземпляры подклассов на основе значения столбца «Тип», и если это вообще возможно.

Я был бы признателен за любую помощь, которую вы, ребята, можете дать. Заранее спасибо!


person Alex Beardsley    schedule 10.11.2010    source источник


Ответы (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 { ... }
person axtavt    schedule 10.11.2010