在hibernate中,错误的值用作获取集的参数

时间:2013-01-31 17:38:14

标签: mysql sql hibernate foreign-keys hibernate-mapping

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

例如,我的表看起来像这样:

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>

我在这些表中的值如下:

用户: 用户id = 172 串行= 1

汽车: carId = 159 串行= 1

carId = 160 串行= 1

我在log4j中启用了跟踪级别日志记录,并发现hibernate正在尝试通过“serial”字段检索汽车,但是在172的where子句中使用“userId”而不是实际带回来的1孩子。

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

1 个答案:

答案 0 :(得分:0)

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