首页 > 解决方案 > 删除多对一关系不持久

问题描述

我正在尝试从多对一关系中删除一个实体。它没有抛出任何错误,但似乎该项目没有被删除,我不知道为什么。这些是我的课:

客户实体:

public class Client extends BaseEntity<Long> {

    private String name;
    private String email;
    private LocalDate dateOfBirth;
    private LocalDate dateOfRegister;

    @OneToMany(mappedBy = "client", cascade = CascadeType.ALL, fetch =
            FetchType.EAGER)
    private Set<Rental> rentals = new HashSet<>();

    ..............
    }

电影实体:

public class Movie extends BaseEntity<Long>{

    private String title;
    private int year;
    private int duration;
    private String genre;
    private double imdbRating;
    private String trailerLink;

    @OneToMany(mappedBy = "movie", cascade = CascadeType.ALL, fetch =
            FetchType.EAGER)
    private Set<Rental> rentals = new HashSet<>();

    ..................
}

出租(链接)实体:


public class Rental implements Serializable {

    @Id
    @ManyToOne(optional = false, fetch = FetchType.EAGER)
    @JoinColumn(name = "movie_id")
    private Movie movie;

    @Id
    @ManyToOne(optional = false, fetch = FetchType.EAGER)
    @JoinColumn(name = "client_id")
    private Client client;

    @Column(name = "dateRented")
    private LocalDate dateRented;

    @Column(name = "dateDue")
    private LocalDate dateDue;

     .............
}

主键类:

public class RentalPK implements Serializable {
    private Movie movie;
    private Client client;
}

在控制器中,我执行以下操作:

@Override
    public void deleteRental(RentalPK rentalPK) {
        try {
            rentalRepository.deleteById(rentalPK);
        } catch (Exception e) {
            throw e;
        }
    }

有人可以解释为什么它不删除吗?

标签: javahibernatejpa

解决方案


解决了!似乎是因为 Movie 和 Client 实体中的 CascadeType.ALL。似乎 CascadeType.ALL 还包含 CascadeType.PERSIST,它表示链接实体(在我的情况下是租用的)只能从父级中删除。所以我通过替换为解决了这个CascadeType.ALL问题CascadeType.REMOVE

编辑:我不知道这是否是确切的解释,但它有效。


推荐阅读