Получить коллекцию подклассов на основе значения столбца - PullRequest
0 голосов
/ 11 ноября 2010

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

У меня есть два объекта, Гараж и Автомобиль, в отношениях один ко многим. Есть несколько типов транспортных средств, таких как легковые и грузовые автомобили; тип сохраняется в виде строки в таблице 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 Ответ

1 голос
/ 11 ноября 2010

Если вы хотите сохранить текущую схему базы данных, вам нужно использовать 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 { ... }
...