Java 映射列表不会与实体一起保存到数据库中
未保存映射的列表。我为Java 映射列表不会与实体一起保存到数据库中,java,spring,hibernate,spring-mvc,spring-boot,Java,Spring,Hibernate,Spring Mvc,Spring Boot,未保存映射的列表。我为MovieDescription实体设置了值,然后将该实体添加到MovieEntity实体列表中,并将其保存到数据库中。但是,MovieDescription实体不会保存 我有主要实体 @Entity @Table(name = "movies") @Data public class MovieEntity { @Id @Column(unique = true, updatable = false) @GeneratedValue pr
MovieDescription
实体设置了值,然后将该实体添加到MovieEntity
实体列表中,并将其保存到数据库中。但是,MovieDescription
实体不会保存
我有主要实体
@Entity
@Table(name = "movies")
@Data
public class MovieEntity {
@Id
@Column(unique = true, updatable = false)
@GeneratedValue
private Long id;
....
@OneToMany(mappedBy = "movie", cascade = CascadeType.ALL)
private Set<MovieDescription> descriptions;
}
然后我有描述实体
@Entity
@Data
@EqualsAndHashCode(callSuper = true)
public class MovieDescription extends MovieInfo {
private String description;
}
然后我试着把电影保存到基地
@Override
public void createMovie(
@NotNull @Valid final MovieDTO movieDTO,
@Min(1) final Long userId
) throws ResourceNotFoundException {
final UserEntity user = this.userRepository.findByIdAndEnabledTrue(userId).get();
final MovieEntity movie = new MovieEntity();
movie.setStatus(EditStatus.WAITING);
movie.setTitle(movieDTO.getTitle());
movie.setType(movieDTO.getType());
movieDTO.getDescription().ifPresent(description -> {
MovieDescription movieDescription = new MovieDescription();
movieDescription.setDescription(description);
movieDescription.setUser(user);
movieDescription.setStatus(EditStatus.WAITING);
movie.getDescriptions().add(movieDescription);
System.out.println(movieDescription);
});
this.movieRepository.save(movie)
您只需:
movieDescription.setMovie(movie)
您只需:
movieDescription.setMovie(movie)
所以最好的方法是在MovieEntity类中使用一个方便的方法,这将使代码看起来干净,并且不会忘记将引用设置为双向方式
@Entity
@Table(name = "movies")
@Data
public class MovieEntity {
@Id
@Column(unique = true, updatable = false)
@GeneratedValue
private Long id;
....
@OneToMany(mappedBy = "movie", cascade = CascadeType.ALL)
private Set<MovieDescription> descriptions;
public void addMovieDescription(MovieDescription movieDescription){
movieDescription.setMovie(this);
descriptions.add(movieDescription);
}
}
@实体
@表(name=“movies”)
@资料
公共类电影实体{
@身份证
@列(unique=true,updateable=false)
@生成值
私人长id;
....
@OneToMany(mappedBy=“movie”,cascade=CascadeType.ALL)
私有集描述;
public void addMovieDescription(MovieDescription MovieDescription){
movieDescription.setMovie(this);
说明。添加(电影说明);
}
}
因此,最好的方法是在MovieEntity类中使用一个方便的方法,这将使您的代码看起来干净,并且您不会忘记将引用设置为双向方式
@Entity
@Table(name = "movies")
@Data
public class MovieEntity {
@Id
@Column(unique = true, updatable = false)
@GeneratedValue
private Long id;
....
@OneToMany(mappedBy = "movie", cascade = CascadeType.ALL)
private Set<MovieDescription> descriptions;
public void addMovieDescription(MovieDescription movieDescription){
movieDescription.setMovie(this);
descriptions.add(movieDescription);
}
}
@实体
@表(name=“movies”)
@资料
公共类电影实体{
@身份证
@列(unique=true,updateable=false)
@生成值
私人长id;
....
@OneToMany(mappedBy=“movie”,cascade=CascadeType.ALL)
私有集描述;
public void addMovieDescription(MovieDescription MovieDescription){
movieDescription.setMovie(this);
说明。添加(电影说明);
}
}
是否抛出任何错误消息?不会抛出任何错误消息。录音没问题。然后我转到数据库,没有。抛出任何错误消息?没有抛出任何消息。录音没问题。然后我转到数据库,没有。所以我必须单独保存电影和描述?不,你不必,它将自动保存,因为你有CascadeType。所有。如果您的意思是如果将生成两个插入查询,那么是的,没有其他方法。因此我必须单独保存电影和描述?不,您不必这样做,因为您有CascadeType.ALL
,它将自动保存。如果您的意思是如果将生成2个insert查询,那么是的,没有其他方法。