为什么我不能在JPA中删除此实体?

时间:2019-12-25 22:34:33

标签: spring spring-boot jpa spring-data-jpa

这非常令人困惑,我找不到解决方案。.我一直在寻找小问题的解决方案,然后又出现了新的问题。我需要能够删除该实体,但是每当我使用该方法时,它什么都不做。

我有4个实体,它们是: 类型:

public class Genre extends MusicEntity {

@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "genre_id")
private List<Artist> artistList;
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "genre_id")
private List<Album> albumList;
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "genre_id")
private List<Track> trackList;

艺术家:

public class Artist extends MusicEntity {

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "artist_id")
private List<Album> artistAlbumList;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "artist_id")
private List<Track> artistTrackList;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="genre_id")
private Genre genre;
private String image;

相册: 公共类Album扩展了MusicEntity {

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
@JoinColumn(name = "album_id")
private List<Track> trackList;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "artist_id")
private Artist artist;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "genre_id")
private Genre genre;
private String image;

跟踪:

public class Track extends MusicEntity {

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "genre_id")
private Genre genre;
@JsonIgnore
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "album_id")
private Album album;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "artist_id")
private Artist artist;

所有4个扩展MusicEntity都只包含ID,EntityTitle和Description。然后它们都具有AttributeOverrides来将其ID更改为track_id或album_id,以及所有4上的track_description或album_description。

我可以编辑专辑并替换其中的曲目。但是我无法删除相册。为什么?当我使用方法“ albumRepository.delete(deleteAlbum);”时,阻止JPA执行此操作的原因是什么?或“ jpaRepository.delete(entity)”?

2 个答案:

答案 0 :(得分:1)

只要有一个Artist实例引用一个Album实例,就不能删除Album实例。您需要先从歌手中删除专辑。

通常,使用批注中的CascadeType,您可以控制要删除的类的子级或在何处删除子级。参见this tutorial

答案 1 :(得分:0)

您确定要删除的专辑没有与之相关的歌手吗?如果没有,那么您应该可以删除。如果有一些艺术家,那么您将无法做到。

另一方面,如果您删除某个艺术家,则该艺术家的所有专辑都应删除。