Weblogic 10.3.4でEJB 3とHibernate 4を使用しています。
親エンティティに存在しないプロパティに基づいてエンティティを選択しようとすると問題が発生します。
私のシステムには、基本的な抽象的なVehicleDefinitionクラスと2つの具体的なサブクラスであるCarDefinitionとTruckDefinitionがあります。
また、私は基本的な抽象的なVehicleInstanceと2つの具体的なサブクラス - CarInstanceとTruckInstanceを持っています。
VehicleInstanceにはVehicleDefinitionフィールドがあります。
TruckDefinitionクラスでは、VehicleDefinitionまたはCarDefinitionに存在しないフィールド(高さ)をマップします。問題は、前述のマッピングでは、TruckInstanceはTruckDefinitionではなくVehicleDefinitionのみを認識するため、HQLを使用してTruckDefintionのフィールド(つまり、高さによるA TruckInstance)でTruckInstanceを選択することはできません。
マッピングは次のようになります。
@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 {...}
私はクラスをリファクタリングし、VehicleInstance抽象クラスでgetDefinitionを作成し、TruckInstanceとCarInstanceを実装して両方のrepectivetypeを返すようにしましたが、2つのメソッドがどのように新しいメソッドをマップするかを理解できませんでした。元の注釈をVehicleInstanceに保持する必要がありますか?両方ともVEHICLE_IDを指しているはずですか?私が試したすべての組み合わせは失敗したようだ。
結論として、VehicleInstance、CarInstance、およびTruckInstanceをどのようにマップすれば、Heightプロパティに基づいてHQLでTruckInstanceを選択できるのでしょうか?
前もって感謝します!