Hibernate OneToMany关联删除实体后父实体未实时更新问题
问题解决:删除Hibernate子实体后父实体未实时更新
核心原因
- 持久化上下文缓存未同步:你直接通过
photoMeetDao.deletePhoto()执行删除(推测是原生SQL/JPQL直接操作数据库),绕过了Hibernate的持久化上下文管理,导致当前会话缓存中的User实例的photos集合仍为旧数据。 - 一级缓存命中:即使调用
userDao.findById(),由于当前会话中已存在该User的持久化实例(方法参数传入的user),Hibernate会直接返回缓存中的旧对象,不会重新从数据库查询。
解决方案
方案1:通过双向关联维护删除逻辑(推荐)
利用Hibernate的双向关联机制,先从父实体的集合中移除子实体,再删除子实体,Hibernate会自动同步缓存和数据库:
public UserDto deleteMeetPhoto(User user, String photoID) { PhotoMeet photoAux = photoMeetDao.selectPhotoByIdAndUser(photoID, user.getId()); // 从父实体的集合中移除子实体 user.getPhotos().remove(photoAux); // 删除子实体(使用JPA的delete方法操作实体,而非自定义的deletePhoto) photoMeetDao.delete(photoAux); // 此时user处于持久化状态,Hibernate会自动同步到数据库,无需重新查询 return new UserDto(user); }
同时优化实体映射:
- 将
User的@OneToMany中orphanRemoval设为true,这样移除集合元素时会自动删除子实体,无需手动调用delete:@LazyCollection(LazyCollectionOption.FALSE) @OneToMany(mappedBy = "user", orphanRemoval = true, cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH}) private List<PhotoMeet> photos; - 移除
PhotoMeet的@ManyToOne中的CascadeType.REMOVE,级联删除父实体不合理,易导致意外数据删除:@ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH }, fetch = FetchType.LAZY) @JoinColumn(name = "user_id") private User user;
方案2:强制刷新会话/实体(适用于必须用自定义deletePhoto的场景)
如果必须保留deletePhoto()的自定义删除逻辑(比如原生SQL),需要强制让Hibernate从数据库重新加载最新数据:
方式A:清除会话缓存后重新查询
@Autowired private EntityManager entityManager; public UserDto deleteMeetPhoto(User user, String photoID) { photoMeetDao.deletePhoto(photoAux.getId(), user.getId()); // 清除当前会话的一级缓存,让后续查询从数据库加载 entityManager.clear(); // 重新查询User,此时会获取最新数据 User refreshedUser = userDao.findById(user.getId()).get(); return new UserDto(refreshedUser); }
方式B:刷新实体
@Autowired private EntityManager entityManager; public UserDto deleteMeetPhoto(User user, String photoID) { photoMeetDao.deletePhoto(photoAux.getId(), user.getId()); // 先将删除操作同步到数据库 entityManager.flush(); // 刷新User实体,从数据库重新加载数据 entityManager.refresh(user); return new UserDto(user); }
内容的提问来源于stack exchange,提问作者mateo cunha
相关产品推荐
相关产品推荐

