错误外键上的 HIbernate 映射

HIbernate mapping on the wrong froreign key

我有 2 个 类 设备和位置有关系 one-to-many/many-to-one(一个设备有多个位置,一个位置关联到一个且只有一个设备)。

我已经在休眠映射文件中明确指定我希望我的 table 加入 device.DeviceID = position.FK_DeviceID,但是当我执行以下 HQL 查询时:

String queryString =  "select position" 
                        + " from Position position join position.device device"
                        + " where device.MACAddress = '" + macAddress + "'";

我不断收到错误消息:" ERROR: Unknown column 'position0_.deviceID' in 'field list' ",表明他试图加入 "deviceID" 而不是 "FK_deviceID"。

这是 类 和映射文件:

职位:

private Integer positionID;
private Coordinate coordinate;
private Date timestamp;
private Device device;

设备:

private Integer deviceID;
private String MACAddress;
private String name;
private Set<Position> positions;

设备映射:

<hibernate-mapping>
<class name="fr.utbm.LO53_IPS.models.Device" table="device" catalog="bdd_LO53">
    <id name="deviceID" type="java.lang.Integer">
        <column name="deviceID" />
        <generator class="identity" />
    </id>
    <property name="MACAddress" type="string">
        <column name="MACAddress" length="45" not-null="true"/>
    </property>
    <property name="Name" type="string">
        <column name="Name" length="45" not-null="false" />
    </property>
    <set name="positions" cascade="all">
        <key column="FK_DeviceID"/>
        <one-to-many class="fr.utbm.LO53_IPS.models.Position" />
    </set>
</class>

位置映射:

<hibernate-mapping>
<class name="fr.utbm.LO53_IPS.models.Position" table="position" catalog="bdd_LO53">
    <id name="PositionID" type="java.lang.Integer">
        <column name="deviceID" />
        <generator class="identity" />
    </id>
    <property name="Timestamp" type="java.sql.Date">
        <column name="Timestamp" not-null="true"/>
    </property>
    <many-to-one name="device" column="FK_DeviceID" 
        class="fr.utbm.LO53_IPS.models.Device" not-null="true"/>
    <component name="Coordinate" class="fr.utbm.LO53_IPS.models.Coordinate">
        <property name="x" type="java.lang.Integer">
            <column name="x" not-null="true" />
        </property>
        <property name="y" type="java.lang.Integer">
            <column name="y" not-null="true" />
        </property>
    </component>
</class>

抱歉这么久了post,我真的想不通哪里错了。

在 class 位置的映射中,当您声明 id 时,您正在指定一个名为 deviceID 的列,这有点奇怪,因为您应该有一个列 PositionID,因为您在 table位置。

另一方面,您可以像这样轻松加入:从位置 p where p.device.MACAddres='....' 无需显式使用加入。