Отображение унаследованных полей - PullRequest
0 голосов
/ 06 февраля 2012

Я использую EJB 3 с Hibernate 4 в Weblogic 10.3.4.

У меня проблема при попытке выбрать сущность на основе свойства, которого нет в его родительской сущности:

В моей системе есть что-то вроде этого: базовый абстрактный класс VehicleDefinition и два конкретных подкласса - CarDefinition и TruckDefinition.

Кроме того, у меня есть базовый абстрактный VehicleInstance и два конкретных подкласса - CarInstance и TruckInstance.

В VehicleInstance у меня есть поле VehicleDefinition.

В классе TruckDefinition я сопоставляю поле (Высота), которого не существует ни в VehicleDefinition, ни в CarDefinition.Проблема заключается в том, что с указанным отображением я не могу использовать HQL для выбора TruckInstance по полю TruckDefintion (т.е. по TruckInstance по высоте), потому что TruckInstance «знает» только VehicleDefinition, а не TruckDefinition.

Сопоставления выглядят примерно так:

@Entity
@Table(name = "VEHICLES" uniqueConstraints = {@UniqueConstraint(columnNames = {"TYPE_NAME"}) })
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "VEHICLE_TYPE", discriminatorType = DiscriminatorType.INTEGER)
public abstract class VehicleDefinition {...}

@Entity
@DiscriminatorValue("222")
public class CarDefenition extends VehicleDefinition {...}

@Entity
@DiscriminatorValue("555")
public class TruckDefenition extends VehicleDefinition{
    ...
    private Integer mHeight;

    @Column(name = "TRUCK_HIGHT")
    public Integer getHeight()
    {
        return mHeight;
    }
}

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorFormula("CASE WHEN 222 = (SELECT a.VEHICLE_TYPE FROM VEHICLES a WHERE a.id = VEHICLE_ID) THEN 222 ELSE 555 END")
@Table(name = "VEHICLE_INSTANCES" uniqueConstraints = {@UniqueConstraint(columnNames = {"VEHICLE_ID", "LPLATE"}) })
public abstract class VehicleInstance {
    ...

    private VehicleDefinition mDefinition
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "VEHICLE_ID" referencedColumnName = "ID", nullable = false)
    public VehicleDefenition getDefinition()
    {
        return mDefinition;
    }
}

@Entity
@DiscriminatorValue("222")
public class CarInstance extends VehicleInstance {...}

@Entity
@DiscriminatorValue("555")
public class TruckInstance extends VehicleInstance {...}

Я попытался провести рефакторинг классов, сделав абстракцию getDefinition в VehicleInstance и реализовав TruckInstance и CarInstance, которые оба возвращали свои типы повторений, но потом я не мог понятькак два сопоставить новые методы.Должен ли я сохранить оригинальные аннотации в VehicleInstance?Должны ли они оба указывать на VEHICLE_ID?Казалось, что каждая комбинация, которую я пробовал, терпела неудачу.

Итак, заключение: как мне сопоставить VehicleInstance, CarInstance и TruckInstance, чтобы я мог выбрать в HQL TruckInstance на основе его свойства Height?

Спасибо зазаранее!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...