2011-06-30 8 views
1

imは中間のエンティティクラスを使用してジョイント可能に追加のカラムをマッピングし、IDが両方のfキーから生成される限り正常に動作します関係するテーブルから。追加の列をコンポジットIDにマッピングしながら、プロパティマッピングを保持します

同じエンティティクラスの3番目の列「リビジョン」をcomposite-idに実装したいが、通常のプロパティマッピングでそれを使用する必要があります。 composite-idマッピングは正常に動作しますが、 "revision"の通常のマッピングはisntです。

私はこの問題のために冗長なデータ/列を使用せずに良い解決策を見つけましたが、なぜextracolumnsを持つ継ぎ手のエンティティクラスを使用するのが一般的な方法ですか?

これを正しくマップする方法についての情報や、参考情報のリンクについては、助けてくれてありがとうございます。

"初期のSessionFactory作成failed.org.hibernate.MappingException:テーブルbacklogaufgabeから関連がマップされていないクラスを参照します。int":

<hibernate-mapping package="app.domain"> 
<class mutable="false" name="app.domain.BacklogAufgabe" table="backlogaufgabe"> 
    <composite-id class="BacklogAufgabe$Id" name="id"> 
    <key-property access="field" column="id_backlog" name="backlogId"/> 
    <key-property access="field" column="id_aufgabe" name="aufgabeId"/> 
    <key-property access="field" column="revision" name="revisionId"/> 
    </composite-id> 
    <property column="datum" name="datum" not-null="true" type="date"/> 
    <property column="rang" name="rang" not-null="true" type="int"/> 

    <property column="revision" name="revision" not-null="true" type="int"/> 

    <property column="aufw_schaetzung" name="aufwSchaetzung" not-null="true" type="int"/> 
    <property column="aufw_messung" name="aufwMessung" not-null="true" type="int"/> 
    <many-to-one cascade="save-update" column="id_aufgabe" insert="false" lazy="false" 
    name="aufgabe" not-null="true" update="false"/> 
    <many-to-one cascade="save-update" column="id_backlog" insert="false" lazy="false" 
    name="backlog" not-null="true" update="false"/> 
    <many-to-one cascade="save-update" column="revision" insert="false" lazy="false" 
    name="revision" not-null="true" update="false"/> 
</class> 
</hibernate-mapping> 

SQL:

CREATE TABLE backlogaufgabe 
(
    id serial NOT NULL, 
    id_backlog integer NOT NULL, 
    id_aufgabe integer NOT NULL, 
    revision integer NOT NULL, 
    datum date NOT NULL, 
    rang integer NOT NULL, 
    aufw_schaetzung integer, 
    aufw_messung integer, 
    CONSTRAINT backlogaufgabe_pkey PRIMARY KEY (id), 
    CONSTRAINT backlogaufgabe_id_aufgabe_fkey FOREIGN KEY (id_aufgabe) 
     REFERENCES aufgabe (id) MATCH SIMPLE 
     ON UPDATE CASCADE ON DELETE RESTRICT, 
    CONSTRAINT backlogaufgabe_id_backlog_fkey FOREIGN KEY (id_backlog) 
     REFERENCES backlog (id) MATCH SIMPLE 
     ON UPDATE CASCADE ON DELETE RESTRICT 
) 
WITH (
    OIDS=FALSE 
); 
このマッピングで表示されます

答えて

0

テーブルを作成する際に、主キーとしてリビジョンを入れてください。マッピングファイルに気付いたので、既にプライマリキーであったIDは言及せず、実際のテーブルではそうではないプライマリキーとしてリビジョンを追加しました。もしあなたが私の言いたいことを見たら。だから多分idの代わりに主キーとしてリビジョンを置くべきでしょう。

CREATE TABLE backlogaufgabe 
(
    id_backlog integer NOT NULL, 
    id_aufgabe integer NOT NULL, 
    revision integer NOT NULL, 
    datum date NOT NULL, 
    rang integer NOT NULL, 
    aufw_schaetzung integer, 
    aufw_messung integer, 
    CONSTRAINT backlogaufgabe_pkey PRIMARY KEY (revision), 
    CONSTRAINT backlogaufgabe_id_aufgabe_fkey FOREIGN KEY (id_aufgabe) 
     REFERENCES aufgabe (id) MATCH SIMPLE 
     ON UPDATE CASCADE ON DELETE RESTRICT, 
    CONSTRAINT backlogaufgabe_id_backlog_fkey FOREIGN KEY (id_backlog) 
     REFERENCES backlog (id) MATCH SIMPLE 
     ON UPDATE CASCADE ON DELETE RESTRICT 
) 
WITH (
    OIDS=FALSE 
); 
+0

こんにちはcascadox、答えのためのTHX:

はこれを試してみてください。リビジョンは冗長である必要があります。したがって、リビジョンはテーブルのpKeyにはなりません。 – MrMiyagi