0

私のhbm.xmlファイルは次のようなものです。

<hibernate-mapping>
<class name="pojopackage.WordhelperWordusage" table="WORDHELPER_WORDUSAGE" schema="SOZANA">
    <composite-id name="id" class="pojopackage.WordhelperWordusageId">
        <key-property name="idwh" type="java.lang.Integer">
            <column name="IDWH" />
        </key-property>
        <key-property name="idwu" type="java.lang.Integer">
            <column name="IDWU" />
        </key-property>
        <key-property name="type" type="java.lang.Integer">
            <column name="TYPE" />
        </key-property>
    </composite-id>
    <many-to-one name="wordhelper" class="pojopackage.Wordhelper" update="false" insert="false" fetch="select">
        <column name="IDWH" />
    </many-to-one>
    <many-to-one name="wordusage" class="pojopackage.Wordusage" update="false" insert="false" fetch="select">
        <column name="IDWU" />
    </many-to-one>
</class>

しかし、「WordhelperWordusage.java」と「WordhelperWordusageId.java」の2つのPOJOクラスがあるので、混乱しています。このクラスをどのように処理する必要がありますか?実装方法は?前もって感謝します! アップデート

私はこれが好きでした

wordhelper_wordusage.save(wordhelper);
wordhelper_wordusage.save(wordusage);
session.save(wordhelper);
session.save(wordusage);
session.save(wordhelper_wordusage);

しかし、それは私にこのような例外を与えます:

Hibernate: select max(ID) from SOZANA.WORDFORM
Hibernate: select max(ID) from SOZANA.WORDHELPER
Exception in thread "main" org.hibernate.id.IdentifierGenerationException:
ids for this   class must be manually assigned before calling save():   pojopackage.WordhelperWordusage

4

3 に答える 3

2

複合PKは通常、PKクラスにマップされるため、Hibernateはそれらを適切に処理できます。あなたが投稿したマッピングの場合です。PKクラスの使用は必須ではないことに注意してください。要素の属性WordhelperWordusageを省略した場合は、これらのPK属性をまったく同じクラスにマップできます(ただし、お勧めしません)。詳細については、この関連する質問を参照してください:休止状態の複合キーclass<composite-id>

そのマッピングファイルを前提とした実装に関しては、マッピング内の属性を使用してクラスを作成するだけで十分ではないでしょうか。

package pojopackage;

public class WordhelperWordusage { 

    private WordhelperWordusageId id;
    private Wordhelper wordhelper;
    private Wordusage wordusge;

    // Getters / Setters

    // Implement equals() and hashCode() delegating to id
}

package pojopackage;

public class WordhelperWordusageId { 
    private Integer idwu;
    private Integer type;

    // Getters / setters

    // Implement equals() and hashCode() consistently, using idwu and type.

}

これらのクラスで一貫しhashCode()て実装することを忘れないでください。equals()そのため、WordhelperWordusageのハッシュコードはそのIDのハッシュコードであり、IDが等しい場合にのみ等しくなります。idクラスの場合、2つのInteger属性をハッシュし、それらを比較しますequals()

于 2012-10-03T12:11:23.440 に答える
0

WordhelperWordusageId.javaクラスは、主キーを構築するために使用されます。これには、idwhとidwuの2つの属性があります。この属性の組み合わせにより、主キーが定義されます。Hibernateは複合キーのオブジェクトを作成し、equalsとhashCodeメソッドをオーバーライドします。このオブジェクトは、メインのWordhelperWordusage.javaオブジェクトのキーを識別するために使用されます。したがって、簡単にするために、オブジェクトを単純なid列属性と見なします。唯一の違いは、これが単純な属性ではなくオブジェクトであるか、IDのすべてのルールが適用されることです。例外ジェネレータスキーム。

于 2012-10-03T12:10:50.900 に答える
0

これは、 http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/mapping.html#mapping-declaration-componentに役立ちます

于 2012-10-03T12:11:56.187 に答える