2 回答

TA貢獻(xiàn)1827條經(jīng)驗 獲得超8個贊
也許您在服務(wù)方法中實現(xiàn)了類似的東西(您沒有顯示它),但我認(rèn)為它丟失了:您沒有級聯(lián)任何東西(分別保存另一個類的對象)。您應(yīng)該將@ManyToMany
注釋更改為@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
.?這會導(dǎo)致級聯(lián)合并和持久操作(保存新對象或任何更改都會導(dǎo)致自動更新另一個對象)。
更新:基于@Alan Hay 的帖子實施
模型
@Entity
public class Actor {
? ? @Id
? ? @GeneratedValue(strategy = GenerationType.IDENTITY)
? ? private Long id;
? ? private String name;
? ? private String surname;
? ? private String age;
? ? @ManyToMany
? ? @JoinTable(name = "movie_actor")
? ? private List<Movie> movies = new ArrayList<>();
? ? public void addMovie(Movie movie) {
? ? ? ? movies.add(movie);
? ? ? ? movie.getActors().add(this);
? ? }
? ? public void removeMovie(Movie movie) {
? ? ? ? movies.remove(movie);
? ? ? ? movie.getActors().remove(this);
? ? }
? ? // Constructors, getters and setters...
? ? // Equals and hashCode methods a la?
? ? // https://vladmihalcea.com/how-to-implement-equals-and-hashcode-using-the-jpa-entity-identifier/
}
@Entity
public class Movie {
? ? @Id
? ? @GeneratedValue(strategy = GenerationType.IDENTITY)
? ? private Long id;
? ? private String title;
? ? private String genre;
? ? private String year;
? ? @ManyToMany(mappedBy = "movies", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
? ? private List<Actor> actors;
? ? public Movie(String title, String genre, String year, List<Actor> actors) {
? ? ? ? this.title = title;
? ? ? ? this.genre = genre;
? ? ? ? this.year = year;
? ? ? ? actors.forEach(a -> a.addMovie(this));
? ? }
? ? // Getters and setters...
}
創(chuàng)建方法
@GetMapping("/create")
public void create() {
? ? Actor actor1 = new Actor("Pedro", "Perez", "40");
? ? Actor actor2 = new Actor("Alfredo", "Mora", "25");
? ? Actor actor3 = new Actor("Juan", "Martinez", "20");
? ? Actor actor4 = new Actor("Mario", "Arenas", "30");
? ? List<Actor> actorList = new ArrayList<>();
? ? actorList.add(actor1);
? ? actorList.add(actor2);
? ? actorList.add(actor3);
? ? actorList.add(actor4);
? ? Movie movie = new Movie("Titanic", "Drama", "1984", actorList);
? ? movieService.create(movie);
}

TA貢獻(xiàn)1853條經(jīng)驗 獲得超18個贊
這里有兩個問題。
首先,您尚未設(shè)置關(guān)系的級聯(lián)選項。
@ManyToMany(mappedBy = "movies", cascade = {CascadeType.PERSIST, CascadeType.MERGE}) private List<Actor> actors;
其次,在雙向關(guān)系的情況下,您有責(zé)任在內(nèi)存模型中維護(hù)關(guān)系的雙方。這里的關(guān)系由 Actor(沒有 的一方)管理mappedBy
,但您尚未將任何電影添加到 Actor 的電影集合中。
因此,如果您在電影構(gòu)造函數(shù)中迭代演員并添加電影a.getMovies().add(this)
,那么雙方都將被設(shè)置,并且數(shù)據(jù)應(yīng)根據(jù)要求保存。
Hibernate 文檔建議@ManyToMany
應(yīng)避免映射,因為在大多數(shù)情況下,您可能希望存儲與關(guān)聯(lián)相關(guān)的其他數(shù)據(jù):例如,在您的情況下,角色名稱。更靈活的選擇是創(chuàng)建一個連接實體,例如 MovieAppearance,它具有 Movie、Actor 和其他所需的屬性。
添加回答
舉報