Java 休眠加载同一行

Java 休眠加载同一行,java,hibernate,hql,Java,Hibernate,Hql,我有一张桌子 canvastowidgets { idCanvas int PK idWidgets int PK version varchar sequence int position int inPanelOrNot int } 和映射xml,如下所示 <hibernate-mapping> <class name="com.config.canvas.CanvasHasWidget" table="canvas

我有一张桌子

canvastowidgets
{
    idCanvas int PK
    idWidgets int PK
    version varchar
    sequence int
    position int
    inPanelOrNot int
}
和映射xml,如下所示

<hibernate-mapping>
    <class name="com.config.canvas.CanvasHasWidget" table="canvastowidgets">
        <id name="canvasId" type="int">
            <column name="idCanvas" />
            <generator class="assigned" />
        </id>
        <property name="widgetId" type="int">
            <column name="idWidgets" />
        </property>
        <property name="sequence" type="int">
            <column name="sequence" />
        </property>
        <property name="position" type="int">
            <column name="position" />
        </property>
        <property name="inPanel" type="boolean">
            <column name="inPanelOrNot" />
        </property>
    </class>
</hibernate-mapping>
Query query = session.createQuery("from CanvasHasWidget where idCanvas = :id");
        query.setParameter("id",canvas.getCanvasId());
        return query.list();
疑问是

select canvashasw0_.idCanvas as idCanvas1_2_, canvashasw0_.idWidgets as idWidget2_2_, canvashasw0_.sequence as sequence3_2_, canvashasw0_.position as position4_2_, canvashasw0_.inPanelOrNot as inPanelO5_2_ from canvastowidgets canvashasw0_ where idCanvas=?
07:38:16822 TRACE BasicBinder:81-将参数[1]绑定为[INTEGER]-[1]
07:38:16829 TRACE BasicExtractor:78-提取的值([idCanvas1_2\]:[INTEGER])-[1] 07:38:16835 TRACE BasicExtractor:78-提取的值([idCanvas1_2_]:[INTEGER])-[1] 07:38:16840 TRACE BasicExtractor:78-提取值([idCanvas1_2_]:[INTEGER])-[1]


列表返回3行,表中有3行。但是返回的所有3行都是相同的。

问题是您的表有一个复合主键,如下所示:

idCanvas int PK
idWidgets int PK
但您只映射了其中一个。更改映射并将
id
部分替换为

<composite-id>
    <key-property name="idCanvas"/>
    <key-property name="idWidgets"/>
</composite-id>


直接在数据库中运行查询时会发生什么?选择canvashasw0_u0.idCanvas作为idCanvas1_2_0,canvashasw0.idWidgets作为idWidget2_0,canvashasw0.sequence作为sequence3_2_0,canvashasw0_0.position作为position4_2_0,canvashasw0_0.inPanelOrNot作为canvastowidgets CanvasW0的inPanelO5_2_0,其中IDCanvasCanvasWu0=?表的PK是一个对偶(IDCanvasCanvas,idWidgets),而您只映射了其中一个。这就是导致问题的原因。@Javakid它返回3个不同的行,而不是same@Ean你能分享hbm文件片段吗?我想这可以解决你的问题,但不确定,因为我记不清了