hibernate 休眠删除实体OneToMany不起作用

eivnm1vs  于 8个月前  发布在  其他
关注(0)|答案(1)|浏览(71)

我正在使用SpringBoot和Hibernate开发应用程序。问题是:当我删除包含的实体时,此操作不会在包含实体上以真实的时间反映出来,但会反映在我的数据库中。(我认为这与Hibernate的上下文或Hibernate的该高速缓存有关)
代码是:

public UserDto deleteMeetPhoto(User user, String photoID) {
    
    PhotoMeet photoAux = photoMeetDao.selectPhotoByIdAndUser(photoID, user.getId());
    photoMeetDao.deletePhoto(photoAux.getId(), user.getId());
    //Refreshing the user 
    user = userDao.findById(user.getId()).get();

    return new UserDto(user);
}

用户实体代码:

@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(mappedBy = "user", orphanRemoval = false, cascade = {CascadeType.PERSIST,
        CascadeType.MERGE, CascadeType.REMOVE,
        CascadeType.DETACH, CascadeType.REFRESH})
private List<PhotoMeet> photos;

PhotoMeet代码:

@ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH,
        CascadeType.REFRESH, CascadeType.REMOVE }, fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
wvyml7n5

wvyml7n51#

  • 您面临的问题可能与Hibernate的一级缓存和二级缓存有关。当您使用Hibernate删除实体时,更改不会立即反映在一级缓存或相关实体的内存表示中。

默认情况下,您的关系被标记为延迟加载(fetch = FetchType.LAZY)。这意味着Hibernate只会在您显式访问时加载照片集合。如果你想让修改立即被反映出来,你可以将抓取策略改为FetchType.EAGER:
确保您的方法使用@Transactional进行注解。这将正确地管理事务和会话,并且对实体所做的任何更改都将在事务提交时反映出来:

@Transactional
public UserDto deleteMeetPhoto(User user, String photoID) {
    // Your delete logic here
}

相关问题