Я использую 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?
Спасибо зазаранее!