0

一対多の関係でエンティティとテーブルを休止状態にする必要があります。1 つはユーザーで、もう 1 つは車のオブジェクトです。不一致は、親テーブルの主キーと子の外部キー以外のフィールドに参加しようとしていることだと思います。

たとえば、私のテーブルは次のようになります。

CREATE TABLE `User` (
  `userId` int(32) NOT NULL,
  `serial` varchar(32) NOT NULL,
  PRIMARY KEY (`userId`) USING BTREE,
  UNIQUE KEY `serial` (`serial`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;



 CREATE TABLE `Car` (
      `carId` int(32) NOT NULL,
      `serial` varchar(32) NOT NULL,
      PRIMARY KEY (`carId`) USING BTREE,
      KEY `FK_USER_serial` (`serial`),
      CONSTRAINT `FK_USER_serial` FOREIGN KEY (`serial`) REFERENCES `User` (`serial`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

私のマッピングは次のようになります:

ユーザー マッピング:

<hibernate-mapping>
    <class name="User" table="User">
        <id name="userId" type="int">
            <generator class="native" />
        </id>
        <property name="serial" type="string"></property>
          <set name="cars" table="Car" 
                inverse="true" lazy="true" fetch="select">
            <key>
                <column name="serial" not-null="true" />
            </key>
            <one-to-many class="Car" />
        </set>
    </class>
</hibernate-mapping>

車のマッピング:

<hibernate-mapping>
    <class name="Car" table="Car">
        <id name="id" type="int">
            <generator class="native" />
        </id>
        <property name="serial" type="string"></property>
    </class>
</hibernate-mapping>

これらのテーブルにある値は次のとおりです。

ユーザー: userId=172 シリアル=1

車: carId=159 シリアル=1

carId=160 シリアル=1

log4j でトレース レベルのログ記録を有効にすると、休止状態が「シリアル」フィールドで車を取得しようとしているが、実際に子を戻す 1 ではなく、172 の where 句で「userId」を使用していることがわかりました。

テーブルまたはマッピングで何を変更して、Car テーブルにさえない userId ではなく、シリアル外部キーを hibernate に使用させることができますか。

4

1 に答える 1

0

JB Nizet のコメントは正しい解決策です。主キーをシリアルに変更しました。これはすでに一意のインデックスであり、主キーにするのに適しています。

于 2013-02-01T17:44:03.497 に答える