亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何插入具有多對多關系的實體?

如何插入具有多對多關系的實體?

鴻蒙傳說 2023-09-06 14:49:24
我正在使用 Spring 框架。我有兩個實體,電影和演員,所以一部電影可以有很多演員,一個演員可以在很多電影中扮演。接下來我們有課程:import java.util.List;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.JoinTable;import javax.persistence.ManyToMany;@Entitypublic 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;    public Actor(String name, String surname, String age) {        this.name = name;        this.surname = surname;        this.age = age;    }    public Long getId() {        return id;    }    public void setId(Long id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getSurname() {        return surname;    }    public void setSurname(String surname) {        this.surname = surname;    }    public String getAge() {        return age;    }    public void setAge(String age) {        this.age = age;    }    public List<Movie> getMovies() {        return movies;    }    public void setMovies(List<Movie> movies) {        this.movies = movies;    }   }我使用@ManyToMany注釋來定義它們之間的關系。此時,我在 H2 中有一個具有 ID、AGE、NAME 和 SURNAME 列的 Actor 表,具有 ID、GENRE、TITLE 和 YEAR 的表 Movie,以及一個新表 MOVIE_ACTOR,因為帶有 ACTORS_ID 和 MOVIES_ID 列的注釋。直到這里看起來還可以。現在,如果我保存一部電影(我已經為兩個實體實現了擴展 jpaRepository 的服務和存儲庫):@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");    }(我知道這不是一個獲取請求,只是為了檢查電影是否正確保存,只需訪問端點)我得到的是,在表 Movie 中,4 列已正確添加,但 ACTOR 和 MOVIE_ACTOR 均未完成所以省略了 actorList,這兩個表是空的。為什么會發生這種情況以及如何解決?
查看完整描述

2 回答

?
斯蒂芬大帝

TA貢獻1827條經驗 獲得超8個贊

也許您在服務方法中實現了類似的東西(您沒有顯示它),但我認為它丟失了:您沒有級聯任何東西(分別保存另一個類的對象)。您應該將@ManyToMany注釋更改為@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}).?這會導致級聯合并和持久操作(保存新對象或任何更改都會導致自動更新另一個對象)。

更新:基于@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...

}

創建方法

@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);

}


查看完整回答
反對 回復 2023-09-06
?
慕容森

TA貢獻1853條經驗 獲得超18個贊

這里有兩個問題。

首先,您尚未設置關系的級聯選項。

@ManyToMany(mappedBy = "movies", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private List<Actor> actors;

其次,在雙向關系的情況下,您有責任在內存模型中維護關系的雙方。這里的關系由 Actor(沒有 的一方)管理mappedBy,但您尚未將任何電影添加到 Actor 的電影集合中。

因此,如果您在電影構造函數中迭代演員并添加電影a.getMovies().add(this),那么雙方都將被設置,并且數據應根據要求保存。

Hibernate 文檔建議@ManyToMany應避免映射,因為在大多數情況下,您可能希望存儲與關聯相關的其他數據:例如,在您的情況下,角色名稱。更靈活的選擇是創建一個連接實體,例如 MovieAppearance,它具有 Movie、Actor 和其他所需的屬性。


查看完整回答
反對 回復 2023-09-06
  • 2 回答
  • 0 關注
  • 124 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號