2009-08-06 5 views
0

"プロモーション"のオブジェクトモデルをマップしようとしています。すなわち、顧客がサインアップ中にプロモーションコードを入力する。Hibernateでは、同じテーブル内にサブベースのテーブルと<map>を混在させることはできますか?

異なるプロモーションコードには、異なる種類の「特典」があります。つまり、お客様に提供するものです。 例:プロモーションコードXYZ123は、顧客に自分のアカウントで無料の分を提供しますが、別のプロモーションコードは、サインアップ時にユーザーが選択できるさまざまなサブスクリプションプランからさまざまな割引を提供します。

私のドメインモデルでは、共通プロパティを持つ抽象スーパークラスを使用して、さまざまなタイプのメリットをサブクラスとしてモデル化しました。いくつかのタイプのメリットでは異なるプロパティが必要になるため、異なるタイプをサブクラスとしてモデル化することを選択しました。

public abstract class Benefit { 
    //getters/setters for common attributes 
} 

public class FreeMinutesBenefit extends Benefit { 
    public int getFreeMinutes() {...} 
    public void setFreeMinutes(int minutes} {...} 
} 

public class PriceDiscountBenefit extends Benefit { 
    public Map<Plan, BigDecimal> getDiscountMap() {...} 
    public void setDiscountMap(Map<Plan, BigDecimal> map) {...} 
} 

ラフSQLスキーマ:

-- Parent table, maps promotion to benefits 
create table Promo_Benefit (
    map_id integer auto-generated PRIMARY KEY, 
    promo_id integer references PROMOTION(promo_id), 
    type_id integer references BENEFIT_TYPES(type_id) 
); 

create table BenefitDetails_FreeMinutes (
    map_id integer PRIMARY KEY, 
    minutes integer not null, 
    FOREIGN KEY (map_id) references Promo_Benefit(map_id) 
); 

create table BenefitDetails_PriceDiscount (
    map_id integer references Promo_Benefit(map_id), 
    plan_id integer references Plans(plan_id), 
    reduced_price numeric not null, 
    PRIMARY KEY (map_id, plan_id) 
    FOREIGN KEY (map_id) references Promo_Benefit(map_id) 
); 

私は成功した私のHibernateマッピングファイル内の各サブクラスの基本的な性質をマッピングすることができるよ、私は関連をマッピングする方法を考え出すのトラブルを抱えていますPriceDiscountBenefitサブクラスとPlanクラスの間の

サブクラステーブル(BenefitDetails_PriceDiscount)のプライマリキーが単にmap_idカラムではない - つまり、このサブクラステーブルの複数の行が単一のPriceDiscountBenefitエンティティを形成するからです。私が見ることができるように、Hibernateでのtable-per-subclassサポートは、サブクラステーブル内の単一の行が親テーブル内の単一の行にマップされるインスタンスのためのものであると思われます - <map>は、キー/値が含まれています。

私はこれを完全に間違ってマッピングしていますか?私はテーブルごとにサブクラスのパターンを屠殺しているので、私は問題を抱えているかどうかはわかりません。

+0

'Promo_Benefit'テーブルから判断すると、あなたは1対多の関係を持って推進クラスを持っていますこれは本当ですか? – ChssPly76

答えて

1

テーブルごとのサブクラス戦略とは、階層内の各クラス(抽象クラ​​スがあればそれを含む)のテーブルを持ち、すべてがプライマリキーを共有することを意味します。あなたの場合は、BenefitFreeMinutesBenefit、およびPriceDiscountBenefitクラスのそれぞれに別のテーブルがあることを意味します。あなたのテーブル名はちょっと混乱していて、テーブル構造はテーブルごとに多少矛盾しています。

map_idが共有プライマリキーであると仮定すると、BenefitDetails_PriceDiscountテーブルはそれをそのように定義する必要があります。 plan_idは異なる( 'マッピング) table that will hold a map between PriceDiscountBenefit , Plan`と小数点値に属する他の言葉では:。

create table BenefitDetails_PriceDiscount (
     map_id integer PRIMARY KEY, 
     ... /* any other attributes, perhaps? */ 
     FOREIGN KEY (map_id) references Promo_Benefit(map_id) 
); 

create table BenefitDetails_PriceDiscount_Map (
     map_id integer references Promo_Benefit(map_id), 
     plan_id integer references Plans(plan_id), 
     reduced_price numeric not null, 
     PRIMARY KEY (map_id, plan_id) 
     FOREIGN KEY (map_id) references Promo_Benefit(map_id) 
); 
+0

ありがとうございます。これはうまくいきますが、私のBenefitDetails_PriceDiscountは1つの列しか持っていないので(この表の他のプロパティは必要ありません)、FKです。あたかも私がHibernateをサポートするようにしているかのように、データベース設計の視点である –

+0

データベースの観点からはちょっと奇妙ですが、これが唯一の方法です。 idを持つエンティティあなたはまだ2つの別々のテーブルを持っています - 最初はPKだけ、2番目はマップです。 PriceDiscountBenefitに追加のプロパティがないことが確かな場合は、階層ごとのテーブルを使用してみることができますが、エンティティによってはNULLカラムがいくつかあります。 – ChssPly76

関連する問題