2017-07-06 85 views
0

我有許多與附加列。在這裏實現(受Lombok生成getter/setter方法,爲清楚起見移除):休眠ManyToMany與列子刪除

public class User extends BaseEntity { 
@OneToMany(mappedBy = "user", 
     orphanRemoval = true,    
     fetch = FetchType.LAZY 
     cascade = CascadeType.ALL,) 
    private List<UserEvent> attendeeEvents = new ArrayList<>(); 
} 

@Table(
     name = "UC_USER_EVENT", 
     uniqueConstraints = {@UniqueConstraint(columnNames = {"user_id", "event_id"})} 
) 
public class UserEvent extends BaseEntity { 

    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "event_id") 
    private Event event; 

    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "user_id") 
    private User user; 

    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "user_response_id") 
    private UserResponse userResponse; 
} 

public class Event extends BaseEntity { 
    @OneToMany(mappedBy = "event", 
      orphanRemoval = true, 
      fetch = FetchType.EAGER, 
      cascade = CascadeType.ALL) 
    private List<UserEvent> userEvents = new ArrayList<>(); 
} 

我想這一點 - 當我刪除事件,所有連接到它「UserEvents」應該被刪除。如果我刪除用戶,所有「UserEvents」也應該刪除。

刪除我的事件(eventRepository是春天JPA接口):

eventRepository.delete(event); 

從數據庫然後檢索UserEvents:

List<UserEvent> userEvents = userEventsId.stream() 
.map(id -> entityManager.find(UserEvent.class, id)).collect(Collectors.toList()); 

而且還有收藏有2項(這是UserEvents的計數) ,但他們都是「空」。

我無法理解發生了什麼以及如何正確執行。 我需要他們刪除,當我檢查收集應該有0,而不是2.

+1

爲什麼你的多對一映射標有'CascadeType.ALL'?應該刪除一個'UserEvent'還刪除相關的'User'? – crizzis

+1

關於你的問題,在不調用filter()的情況下調用兩個元素流上的'map()'產生一個流,該流仍然有兩個元素 – crizzis

+0

我確信它是休眠問題...謝謝!我已經在UserEvent上刪除了CascadeType.All,但完全不知道map()。 – Evgenii

回答

1

該刪除說明標記爲刪除,請嘗試刪除後調用刷新,然後找到。

我想找到去數據庫,找到兩行,但試圖實例化它們時,找到標記爲刪除的實體,然後你有這種奇怪的行爲。

建議:嘗試從數據庫中抽取更多,並使用較少的註釋。瞭解列和表的名稱約定(如果需要)並讓JPA完成其工作。

+0

這是地圖問題,因爲Ids的集合的大小是2.當我使用stream().map()時,它也返回了大小2的集合。但是有2個空值。關於刷新 - 當我刪除實體 - 它不需要,但如果我更新實體 - 沒有它更新將無法正常工作。 – Evgenii