我正在使用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;
@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;
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;
}
}
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
@Entity
public class Movie {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String genre;
private String year;
@ManyToMany(mappedBy = "movies")
private List<Actor> actors;
public Movie(String title, String genre, String year, List<Actor> actors) {
this.title = title;
this.genre = genre;
this.year = year;
this.actors = actors;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getGenre() {
return genre;
}
public void setGenre(String genre) {
this.genre = genre;
}
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
public List<Actor> getActors() {
return actors;
}
public void setActors(List<Actor> actors) {
this.actors = actors;
}
}
我已经使用@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");
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);
}
((我知道这不是获取请求,只是为了检查电影是否只是访问端点而正确保存了)。我得到的是,在电影表中正确添加了4列,但是ACTOR和MOVIE_ACTOR均未添加完成后,actorList被省略,这两个表为空。为什么会发生这种情况,我该如何解决?
非常感谢您的帮助!
[也许您在服务方法中实现了这样的事情(您没有显示),但是我认为它丢失了:您什么都没有cascade(分别保存另一个类的对象)。您应该将@ManyToMany
注释更改为@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
。这导致级联合并和持久操作(保存一个新对象或进行任何更改会导致自动更新另一个对象)。
也请考虑为列表添加适当的添加和删除方法,如本article和好的equals and hashCode methods中所述。
通常,您可以在Vlad Mihalcea页面上找到有关Hibernate相关问题的很好描述。