継承されたフィールドのマッピング

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を選択できるのでしょうか?

前もって感謝します!

0
私は次のようなことをしています:Query lQ = mDAOService.getEntityManager()。createQuery( "From TruckInstance ti WHERE ti.definition.height = 5");例外は:org.Hibernate.QueryExceptionによって引き起こされる:クラスVehicleDefinitionのプロパティの高さを解決できませんでした
追加された 著者 Ran,
どのクエリを試しましたか?どのエラーが原因ですか? AFAIKでは、プロパティのタイプがスーパークラスであっても、HQLのサブクラスフィールドを使用できるはずです。
追加された 著者 JB Nizet,
私は働いていないと驚いています。 TruckInstanceからinner join tidefinition def(def.height = 5 )のを試しましたか?または TruckInstanceから内部結合tidefinition def(ここで、dev.class = TruckDefinitionおよびdef.height = 5
追加された 著者 JB Nizet,

答えはありません

0