2009-05-12 1 views
1

私はPeople用のテーブルと、Company用のテーブルとPhones用のテーブルを持つアドレス帳アプリケーションを作成しようとしています。 Phonesテーブルには、どこから来たのかを示すフィールドを持つPeopleおよびCompaniesのデータが格納されます。私は非常に簡単に人と、対応する携帯電話を取得することができ、プレーンSQLで2つの列にhibernateコレクションを作成します。

public class Person { 
    private Integer id; 
    private String firstName; 
    private String lastName; 
    private Collection<Phone> phones; 
    // ... 
} 

public class Company { 
    private Integer id; 
    private String name; 
    private Collection<Phone> phones; 
    // ... 
} 

public class Phone { 
    private Integer id; 
    private String number; 
    // ... 
} 

:私は非常に単純な表現であり、それに対応するJavaクラスを作成している

CREATE TABLE `Person` { 
    `id` int(11) NOT NULL auto_increment, 
    `firstName` varchar(80) NOT NULL, 
    `lastName` varchar(80) NOT NULL 
} 

CREATE TABLE `Company` (
    `id` int(11) NOT NULL auto_increment, 
    `name` varchar(80) NOT NULL 
} 

CREATE TABLE `ContactPhone` (
    `id` int(11) NOT NULL auto_increment, 
    `contactType` char(1) NOT NULL, -- either 'P' or 'C' 
    `contactId` int(11) NOT NULL, -- the id of the Person or Company 
    `number` varchar(40) NOT NULL 
} 

:のは、これらは、単純なテーブルがあると仮定しましょう。私はPersonとPhoneの間、CompanyとPhoneの間のマッピングをプレーンな休止状態(注釈なし)で作成する必要がありますが、動作させることはできません。単方向または双方向でなければならないかどうかは確かではありません。私はドキュメントを探しましたが、助けになるものは何も見つかりませんでした。誰でも?

+0

会社と電話の関係は何ですか? – Cherian

+0

会社は単方向の方法で電話機のコレクションを持つことができます。電話から企業への「後方」の接続はありません。 – rmarimon

答えて

0

"Filters" mapping featureを使ってこれを実現できます。

<bag name="Phone" table="CompanyPhoneMapping" lazy="true" cascade="all">

<key column="CompanyId" />

<one-to-many class=<insert namespace>.Phone, <insert dll> />

</bag>

私はnhibernateに慣れていますが、私はJavaの休止状態の解決策は似ていると想定しています。

0

あなたはファイルの設定でマッピングテーブルを介してそれらをマッピングする方法を求めているならば、それはこのようなものになります休止状態

+0

これは、オブジェクトを読み込むときにはうまくいくようですが、オブジェクトを永続化するとどうなりますか?どのように正しい値がContactPhoneテーブルのcontactTypeに挿入されるのでしょうか? – rmarimon

1

最後に、私はこの問題を解決しました。私が探していたのは、冬眠の多型要素でした。私は次のようにContactクラスを作成しました:

public class Contact { 
    private Integer id; 
    private Collection<Phone> phones; 
    ... 
} 

とそれから派生したPersonとCompany。 Hibernateの多態性により、PersonとCompanyを別々のテーブルに格納し、電話機を双方向の方法で連絡先に接続することができます。

+0

これはこれを行う1つの方法です。私のポストを別の方法で見てください。 –

0

これをモデル化するには、PersonおよびCompanyクラスの結合テーブルとの単方向の関連付けがあります。これが正確にどのように達成されるかは、モデルの仕様によって異なります。オンラインドキュメントはhereです。

関連する問題