0

我必须使具有一对多关系的实体和表休眠。一个是用户,另一个是汽车对象。我相信差异在哪里,是我试图加入除父表的主键和子表的外键之外的字段。

例如,我的表格如下所示:

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 中启用了跟踪级别日志记录,发现休眠尝试通过“串行”字段检索汽车,但在 172 的 where 子句中使用“userId”,而不是实际带回孩子的 1。

我可以在我的表或映射中更改什么以使休眠使用串行外键而不是 Car 表甚至没有的 userId。

4

1 回答 1

0

JB Nizet 的评论是正确的解决方案。我将主键更改为串行。它已经是唯一索引,更适合作为主键。

于 2013-02-01T17:44:03.497 回答