【发布时间】:2021-11-22 13:24:26
【问题描述】:
我正在做一个包含帖子和 cmets 的提要
帖子实体
public class Post extends AuditEntity {
@Lob
private String text;
@Column
private int totalCmnts = 0;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "post_id")
private Set<Comment> comments;
@ManyToOne
@JoinColumn(name = "user_id", referencedColumnName = "id")
private MEUser MEUser;
}
评论实体
public class Comment extends AuditEntity {
@Lob
private String text;
@ManyToOne
@JoinColumn(name = "user_id", referencedColumnName = "id")
private MEUser MEUser;
}
并且我有一个服务来删除我获取帖子和评论的评论,我检查当前用户是否可以执行操作然后我删除评论并减少帖子实体中 cmets 的总数。
日志中的问题我可以看到选择操作和更新操作,但删除根本没有执行,仍然在服务类中获得带有@transactional 注释的 HTTP 200
我尝试了一个 SQL 查询,它运行良好
DELETE FROM `db-engine`.comment WHERE comment.id = 2
服务
@Override
public void deleteComment(Long commentID, Long postID, UserPrincipal currentUser) {
Comment comment = commentsRepository.findById(commentID)
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND));
Post post = postsRepository.findById(postID)
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND));
if (comment.getMEUser().getId().equals(currentUser.getId())
|| currentUser.getAuthorities().contains(new SimpleGrantedAuthority(RoleName.ROLE_ADMIN.toString()))
|| currentUser.getAuthorities().contains(new SimpleGrantedAuthority(RoleName.ROLE_SUPER_ADMIN.toString()))) {
commentsRepository.deleteById(comment.getId());
post.setTotalCmnts(post.getTotalCmnts() - 1);
System.out.println(comment.getId());
System.out.println("hello");
}
}
【问题讨论】:
-
不是通过 CommentsRepository 显式删除评论,而是从 Post 实体的
comments集合中删除评论。当 JPA 在事务结束时刷新时,它将从comment表中删除该行。
标签: java spring spring-boot jpql