spring JPAdelete确实运行,但实际上并不从数据库中删除对象

beq87vna  于 2023-03-28  发布在  Spring
关注(0)|答案(1)|浏览(213)

我有一个用户类,它与评论和帖子有一对多的关系。每个用户可以有许多帖子和评论。每个帖子也可以有许多评论。问题是当我试图删除帖子时,删除方法运行,但它不会从数据库中删除。奇怪的是,当我没有从头部获取用户并将其发送到删除方法并发送新用户时()的方法,它的工作正确。我卡住了,我真的你的帮助。
用户类别

@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());
        }
    }
5us2dqdw

5us2dqdw1#

这里的问题是因为:
1.你有一个User-〉PostMap,它指定了合并和持久化的级联选项。
1.删除post时,只删除Post,并保留User示例仍然引用它
当您删除Post时,当JPA检查Persistence单元中的所有实体是否有其他更改时,它会找到您加载的User,并且它具有对现在已删除的Post示例的引用。

em.remove(post); 
em.persist(post);

实际上是无行动
如果不加载User,则不会发生这种情况,因为如果User不在上下文中,JPA将不知道它仍然引用删除Post。()。但是在应用程序中依赖此方法并不是一个好的做法,因为某些人可能最终会在上下文中使用user,导致以后调试复杂的事务代码来解决这个问题时更加痛苦。
当你有双向的关系时,JPA声明它由你来保持这些关系与数据库同步。在这种情况下,正确的方法是除了删除Post之外,还空出/删除User-〉Post引用。你在那个关系上设置了孤儿删除,所以你真的不需要显式地删除Post;只需要从User中取消引用它就足够了。

相关问题