2012-12-01 22 views
0

我們有一個基於Hibernate的(33)Web應用程序,並且正在查找與交換由唯一索引限制的數據值對有關的問題。在我們flightticket 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加票乙分配給參與者P2票據的數據對和交換兩個參與者。門票A最終分配給參與者P2,門票B將分配給參與者P1。但是,FLIGHTID + PARTICIPANTID有一個獨特的約束。

當Hibernate發出的第一次更新來改變參與者P1至P2的票,一個GenericJDBCException拋出

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

有沒有人有這樣一個共同的解決方案?

感謝 西蒙

+0

你使用什麼數據庫? – a1ex07

回答

2

所以,你有這樣的事情:

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); 

中間沖洗將確保只有一對在一段時間引用參與者。

+0

感謝您的提示,實施該方法,它的作用就像一個魅力。有沒有可以自動執行此操作的Hibernate配置?這樣Hibernate批量更新程序會首先將所有參與者更新爲NULL,然後更新爲新值? – Simon

+1

我不知道。順便說一句,這可能會導致更多的傷害比好:在大多數時間不必要的數據庫更新,而不是空違反約束。如果您的數據庫支持延遲約束,您也可以將此約束延遲。這樣,約束只會在提交時檢查。 –