如何交换由唯一索引限制的值对

时间:2012-12-01 16:33:58

标签: hibernate unique-constraint

我们有一个基于Hibernate的(33.)Web应用程序,并且发现了与交换由唯一索引限制的数据值对相关的问题。在我们的航班票据HBM中,我们有

<many-to-one name="participants" class="net.umbrella.entity.ParticipantModel" fetch="select">
    <column name="PARTICIPANTID" not-null="false" />
</many-to-one>
<many-to-one name="flights" class="net.umbrella.entity.FlightModel" fetch="select">
    <column name="FLIGHTID" not-null="true" />
</many-to-one>

在功能上可以获取分配给参与者P1的票A的数据对以及分配给参与者P2的票B并交换两个参与者。票证A最终将分配给参与者P2,票证B将被分配给参与者P1。但是,FLIGHTID + PARTICIPANTID具有唯一约束。

当Hibernate发出第一次更新以将票据A上的参与者P1更改为P2时,抛出GenericJDBCException

Attempt to insert duplicate key row in object 'FLIGHTTICKET' with unique index 'IDX_FLIGHTTICKET_UQ'

有没有人对此有共同的解决方案?

由于 西蒙

1 个答案:

答案 0 :(得分:3)

所以,你有这样的事情:

Participant temp = pair1.getParticipant();
pair1.setParticipant(pair2.getParticipant());
pair2.setParticipant(temp);

相反,只需执行以下操作:

Participant temp1 = pair1.getParticipant();
Participant temp2 = pair2.getParticipant();
pair2.setParticipant(null);
session.flush();
pair1.setParticipant(temp2);
pair2.setParticipant(temp1);

中间同花将确保一次只有一对参考参与者。