2012-02-11 120 views
2

當我試圖給定的圖像添加到相同的目的地城市的兩倍,我得到以下異常:防止NonUniqueObjectException休眠

NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [org.wah.model.ImageEntity#7] 

這是好事,因爲我不想重複。我試圖防止這種情況的發生代碼:

public void addImageToDestination(int idDestination, String imageFileName){ 
    Destination destination = (Destination) getEntity(idDestination); 

    ImageEntityDAO imageDao = new ImageEntityDAO(); 
    ImageEntity image = imageDao.getImage(imageFileName); 

    if(image == null) 
     image = new ImageEntity(imageFileName); 
    else if(destination.getImages().contains(image)){ 
     return; 
    } 

    session.beginTransaction(); 
     destination.getImages().add(image); 
    session.getTransaction().commit(); 
} 

的else-if結構試圖確定它是否已經存在,則無能爲力,回到原樣。但是,else-if條件從不計算爲TRUE並且會話代碼運行,產生NonUniqueObjectException。

我該如何防止這種情況發生?

回答

3

如果你的意思是destination.getImages().contains(image)從不計算true,應該如果兩個ImageEntities具有相同的城市,你應該重寫ImageEntityequals - 方法:

@Override 
public boolean equals(Object o) { 
    if (this == o) return true; 
    if (o == null || getClass() != o.getClass()) return false; 

    ImageEntity that = (ImageEntity) o; 

    if (city != null ? !city.equals(that.city) : that.city != null) return false; 

    return true; 
} 
+0

謝謝!我也明白爲什麼它失敗了,因爲它是在做對象的參考檢查,否則。我們希望通過價值檢查。另外,在實現equals和hashCode之後,我使用google guava和apache通用語言。學習現在使用哪一個。 – brainydexter 2012-02-11 18:40:53