1

次のテーブルを hbm ファイルを使用して Hibernate にマップしようとしています。

CREATE TABLE
    additional_info
    (
        info_id SMALLINT,
        book_id INT,
        desc VARCHAR(32) NULL,
        CONSTRAINT additional_info_pk PRIMARY KEY (info_id, book_id),
        CONSTRAINT additional_info_fk FOREIGN KEY (info_id, book_id) REFERENCES info (id, book_id)
    );

CREATE TABLE
    info
    (
        id SMALLINT,
        book_id INT,
        item_name VARCHAR(32),
        CONSTRAINT pk_info PRIMARY KEY (id, book_id ),
        CONSTRAINT fk_info FOREIGN KEY (book_id ) REFERENCES book (book_id)        );

ご覧のとおり、どちらも同じ 2 フィールドの主キーを共有しています。これは、additional_info から info への外部キーでもあります。

これは、hibernateTools がリレーションを定義した方法です (additional_info hbm):

<composite-id name="id" class="AdditionalInfoId">
    <key-many-to-one name="info" class="Info">
        <column name="info_id" />
        <column name="book_id" />
    </key-many-to-one>
</composite-id>

そしてinfoのhbmで:

<one-to-one name="additionalInfo" class="AdditionalInfo"></one-to-one>

このアプローチを使用すると、java.lang.stackoverflowエラーが発生し続けます。私はさまざまなマッピング/代替の組み合わせを検索して試してきましたが、成功しませんでした-休止状態の経験があまりないため、それは野生の推測に似ています(最近ではほとんどが注釈を使用しています)。<id>andの使用を提案する人<generator>もいますが、PK と FK の両方である 1 対 1 の関係をリンクするために使用される 2 つのフィールドの例を見つけることができませんでした。

私のクラスはすべてシリアライズ可能で、equals メソッドと hashCode メソッドも自動的に生成されます。

「キー多対1」の理由もわかりません。これは 1 対 1 の関係でなければなりません。このキー多対1でコンポジットIDを使用するのは良い考えではないと読みましたが、機能する代替手段を実装できませんでした。

どんな洞察も大歓迎です。

どうもありがとう!

PS: スタック トレースの一部:

java.lang.StackOverflowError
    at java.lang.Integer.equals(Integer.java:747)
    at org.hibernate.util.EqualsHelper.equals(EqualsHelper.java:10)
    at org.hibernate.type.NullableType.isEqual(NullableType.java:214)
    at org.hibernate.type.NullableType.isEqual(NullableType.java:210)
    at org.hibernate.type.AbstractType.isEqual(AbstractType.java:116)
    at org.hibernate.engine.EntityKey.equals(EntityKey.java:97)
    at java.util.HashMap.get(HashMap.java:305)
    at org.hibernate.engine.StatefulPersistenceContext.getEntity(StatefulPersistenceContext.java:322)
    at org.hibernate.impl.SessionImpl.getEntityUsingInterceptor(SessionImpl.java:478)
    at org.hibernate.event.def.DefaultLoadEventListener.loadFromSessionCache(DefaultLoadEventListener.java:436)
    at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:338)
    at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:139)
    at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:195)
    at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:103)
    at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:878)
    at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:846)
    at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:557)
...
4

2 に答える 2

1

双方向参照を定義する場合、それらの 1 つを回避するために遅延する必要がありますStackOverflow

お役に立てば幸いです。

于 2013-04-23T11:26:13.577 に答える