我有一个用户类,它与评论和帖子有一对多的关系。每个用户可以有许多帖子和评论。每个帖子也可以有许多评论。问题是当我试图删除帖子时,删除方法运行,但它不会从数据库中删除。奇怪的是,当我没有从头部获取用户并将其发送到删除方法并发送新用户时()的方法,它的工作正确。我卡住了,我真的你的帮助。
用户类别
@Entity
@Getter @Setter
public class User {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Long userId;
private String email;
@OneToMany (mappedBy = "user", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
private List<Post> posts;
@OneToMany (mappedBy = "user", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
private List<Comment> comments;
}
岗位类
@Entity
@Getter @Setter
public class Post {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Long postId;
@OneToMany (mappedBy = "post", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
private List<Comment> comments;
@ManyToOne(fetch = FetchType.LAZY)
@OnDelete(action = OnDeleteAction.CASCADE)
@JsonIgnore
@JoinColumn (name = "user_id")
private User user;
}
POST控制器类
@RestController
@RequestMapping("/api/posts")
@AllArgsConstructor
public class PostController {
private final PostService postService;
private final UserService userService;
@DeleteMapping("/{postId}")
public ResponseEntity<?> deletePostById (@PathVariable Long postId, @RequestHeader("Authorization") String authorization) {
Post post = postService.getPostById(postId).getData();
String email = JwtUtils.getEmailFromHeader(authorization);
User user= userService.getUserByEmail(email);
Result result = postService.deletePost(post, user);
return new ResponseEntity<>(result, HttpStatus.OK);
}
}
POST服务类中的DELETE方法
public Result deletePost(Post post, User user) {
try {
if (post == null) {
return new Result(false, POST_NOT_FOUND);
}
else if (user.getUserId().equals(post.getUser().getUserId())) {
postRepository.delete(post);
return new Result(true, POST_DELETED);
}
else {
return new Result(false, PERMISSION_DENIED);
}
}
catch (Exception e) {
return new Result(false, e.getMessage());
}
}
1条答案
按热度按时间5us2dqdw1#
这里的问题是因为:
1.你有一个User-〉PostMap,它指定了合并和持久化的级联选项。
1.删除post时,只删除Post,并保留User示例仍然引用它
当您删除Post时,当JPA检查Persistence单元中的所有实体是否有其他更改时,它会找到您加载的User,并且它具有对现在已删除的Post示例的引用。
实际上是无行动
如果不加载User,则不会发生这种情况,因为如果User不在上下文中,JPA将不知道它仍然引用删除Post。()。但是在应用程序中依赖此方法并不是一个好的做法,因为某些人可能最终会在上下文中使用user,导致以后调试复杂的事务代码来解决这个问题时更加痛苦。
当你有双向的关系时,JPA声明它由你来保持这些关系与数据库同步。在这种情况下,正确的方法是除了删除Post之外,还空出/删除User-〉Post引用。你在那个关系上设置了孤儿删除,所以你真的不需要显式地删除Post;只需要从User中取消引用它就足够了。