我有兩個實體:Talk
和User
。用戶可以創建很多會談,併成爲這些會談的「組織者」。當組織者被刪除時,它的談話也應該被刪除。當一個談話(由某個組織者創建)被刪除時,不應該刪除任何用戶,但談話當然應該從數據庫中刪除,但這是而不是發生在我的情況!刪除不在雙向ManyToOne關係
所以,這裏是我到目前爲止所代表什麼,我一直在說的代碼:
// Talk.java
@Entity
public class Talk implements Serializable {
...
@ManyToOne(cascade = {CascadeType.REFRESH, CascadeType.PERSIST})
@JoinColumn(nullable = false, name = "TALK_ORGANIZER_FK")
protected User organizer;
...
和
// User.java
@Entity
public class User implements Serializable {
...
@OneToMany(mappedBy = "organizer", cascade = {CascadeType.REFRESH, CascadeType.REMOVE})
protected List<Talk> organizedTalks;
...
大多數的方法來處理這兩個實體之間的關係將從Task
實體調用。例如,當我需要將用戶添加到講話中時,我會撥打addParticipant
,然後調用joinTalk
,在User
中定義。
所以,我看到這個問題可能是由於cascade
屬性的使用不一致造成的。所以這就是爲什麼我要解釋爲什麼我使用了我用過的東西。
我增加了CascadeType.REFRESH
和CascadeType.PERSIST
選項來organizer
字段中Talk
實體,因爲,每當我把談話的組織者,如果不存在的話,我想將它存儲在數據庫中,而且由於,如果存在,我想更新它(最終)。
我添加的選項CascadeType.REFRESH
和CascadeType.REMOVE
到外地organizedTalks
在實體User
,因爲:
- 每當我刪除一個用戶,我想在級聯
- ,每當被刪除與其相關的會談中,我更新用戶,我想它的相關談判也被更新
注
目前,當我刪除用戶,其所有相關的談判被刪除(如預期!)
要麼,如果我嘗試刪除使用
deleteAll
或removeByField
談話,它不會刪除任何談話,即使它返回,在第二種情況下,假設被刪除的實體的數量(這是上面描述的實際問題!)。
因爲我並不是真的是使用JPA的專家,所以我認爲你可以幫助我解決我的具體問題。
編輯
這是我觀察到的問題的特定測試:
@Test
public void testRemoveByTitleTalkWhenJustOneParticipant() {
Talk t = new Talk("auditorium", new Date(), organizer);
entityManager.persist(t);
assertEquals(talkRepository.removeByTitle("auditorium"), new Long(1));
assertEquals(talkRepository.count(), 0); // ERROR: EXPECTED 1
assertEquals(userRepository.count(), 1); // ONLY halloween WAS STORED
assertEquals(organizer, userRepository.findOneByName("halloween"));
}
你可以顯示你嘗試和刪除你的談話方法的代碼嗎? 如果您的用戶對象處於hibernate上下文中,並且它的列表中仍然存在該對話,則可能是它不會被刪除的原因。 – TheBakker
@TheBakker請看我的答案,它解決了這個問題,但我並不真正理解爲什麼(儘管如我所說,它與你剛纔所說的有些相關)。也許你可以猜得更好。 – nbro