一対多の関係でエンティティとテーブルを休止状態にする必要があります。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 に使用させることができますか。