2017-07-06 87 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