2011-03-23 65 views
2

PlayFramework(JPA,Hibernate)。兩個實體software < -m:n->tag,software是該關係的所有者。我不使用任何cascading。 我想刪除其中包含一些軟件的tagplayframework的多對多刪除問題

考慮到software是業主方,我寫在我的Tag類:

class Tag { 
    @Override 
    public Tag delete() { 
    for (Software software : this.softwares) { 
     software.tags.remove(this); 
     software.save(); // if we delete this, we will have an error - a foreign key constraint fails 
    } 
    return super.delete(); 
    } 
} 

現在工作得很好,我已經添加行software.save()後。 問題是:爲什麼我應該這樣做?

我有另一個項目 - 沒有Play框架 - 它使用JPA-> Hibernate,我不必這樣做。那有什麼區別?

this link它們也不使用save()。

回答

1

您鏈接到的示例中的代碼與您的代碼不完全相同。

在你鏈接就挖掉了一些元素,但如果你在評論閱讀下面他們說代碼:

// then merge() and flush() 

將更改保存到數據庫中。他們也正在從擁有關係的班級中搬走。

在您的方案中,您正在移除標籤,而所有者是關係的另一端。因此,您使用(正確)software.tags.remove來清除關係。

現在,如果不保存,實體管理器尚未確認更改,並且當它試圖刪除標籤時,此實體管理器將檢測到M:N活動關係並失敗。

的原因是遊戲的explicit save,在那裏你必須告訴系統更改,以保存,這是從「默認」方式的Hibernate(JPA)的作品,其中的對象是自動提交(沿變化)時不同交易結束。

+0

事實上,即使使用Tag.em()。persist(),它也需要使用save(),這是否意味着播放以某種方式對EnityManager/Hibernate有影響?即這個em()已經準備/配置爲需要明確使用save()嗎? – ses 2011-03-23 17:02:23

+0

是的,如果您閱讀我在上面發佈的鏈接,則需要明確說出「保存」以存儲更改。 – 2011-03-23 17:25:49