我必须以一对多的关系来休眠实体和表。一个是用户,另一个是汽车对象。我相信差异在哪里,是我试图加入除父表的主键和子键的外键之外的字段。
例如,我的表看起来像这样:
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。
答案 0 :(得分:0)
JB Nizet的评论是正确的解决方案。我将主键更改为串行。它已经是唯一的索引,更适合作为主键。