2017-08-11 25 views
0

我有兩個實體與許多與許多關係:電影和演員實體多對多有誤差與同一ID將

電影

public class Movie { 
    @Id 
    private String imdbId; 
    @ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER, targetEntity = Actor.class) 
    private Set<Actor> actor; 
} 

演員

public class Actor { 
    @Id 
    private String actorId; 
} 

它是一個restful API,我發佈JSON到MovieController。我的json是:

{ 
    "imdbId": "tt2395424", 
    "actor" : [{"actorId" : "0001"}, {"actorId" : "0002"}] 
} 

這工作得很好,演員自動填充。但是當我用相同的actorId插入新電影時,它會拋出actor已經存在的錯誤。我很困惑,因爲據我所知,如果不存在,Hibernate會在插入之前比較id,否則會插入其他地圖。你能告訴我我要去哪裏嗎?

回答

1

問題在於電影類中設置的以上actor的CascadeType.ALLCascadeType.ALL所做的是對嵌入實體執行與父實體相同的操作。保存操作將嘗試將角色保存在Actor表中,如果角色ID已經存在於數據庫中,則保存會引發錯誤。嘗試在電影實體上使用saveOrUpdate而不是save操作。

+0

但我使用堅持...使用持久保存時,saveOrUpdate的另一種替代方法是什麼? –

+0

您可以使用合併而不是持久化,這是saveOrUpdate的替代方法。查找更多細節在https://stackoverflow.com/questions/1069992/jpa-entitymanager-why-use-persist-over-merge –

+0

謝謝..這工作,但任何關於自動生成的ID的想法,因爲對我而言害怕,它會造成重複 –