休眠ManyToMany与列子删除
问题描述:
我有许多与附加列。在这里实现(受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.
答
该删除说明标记为删除,请尝试删除后调用刷新,然后找到。
我想找到去数据库,找到两行,但试图实例化它们时,找到标记为删除的实体,然后你有这种奇怪的行为。
建议:尝试从数据库中抽取更多,并使用较少的注释。了解列和表的名称约定(如果需要)并让JPA完成其工作。
+0
这是地图问题,因为Ids的集合的大小是2.当我使用stream().map()时,它也返回了大小2的集合。但是有2个空值。关于刷新 - 当我删除实体 - 它不需要,但如果我更新实体 - 没有它更新将无法正常工作。 – Evgenii
为什么你的多对一映射标有'CascadeType.ALL'?应该删除一个'UserEvent'还删除相关的'User'? – crizzis
关于你的问题,在不调用filter()的情况下调用两个元素流上的'map()'产生一个流,该流仍然有两个元素 – crizzis
我确信它是休眠问题...谢谢!我已经在UserEvent上删除了CascadeType.All,但完全不知道map()。 – Evgenii