【问题标题】:JPA - does not work cascada type allJPA - 不工作级联类型全部
【发布时间】:2017-10-12 18:21:25
【问题描述】:

在数据库中保存实体列表时遇到问题。

我有实体

@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)
@DiscriminatorValue(value = MovieField.Values.DESCRIPTION)
public class MovieDescription extends MovieInfo {

    private String description;
}

继承自

@Entity
@Table(name = "movies_info")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "dtype")
@Data
public class MovieInfo {

    @Id
    @Column(unique = true, updatable = false)
    @GeneratedValue
    private Long id;

    @ManyToOne
    private MovieEntity movie;
}

虽然我在使用这样的代码时使用cascade = CascadeType.ALL

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);
        movie.getDescriptions().add(movieDescription);
    });
this.movieRepository.save(movie);

将对象本身MovieEntity不带MovieDescription保存到数据库。映射列表不保存到数据库。为什么?

【问题讨论】:

    标签: java spring jpa spring-boot eclipselink


    【解决方案1】:

    在您的情况下,MovieDescription 类是关系所有者。这是由

    暗示的
    @OneToMany(*mappedBy = "movie"*, cascade = CascadeType.ALL)
    private Set<MovieDescription> descriptions;
    

    JPA 仅与所有者保持关系,但您没有在描述中设置 MovieEntity 链接

        MovieDescription movieDescription = new MovieDescription();
        movieDescription.setDescription(description);
        movie.getDescriptions().add(movieDescription);
    

    添加下一行以使其工作:

        movieDescription.setMovie(movie);
    

    【讨论】:

    • 我应该单独保存这个实体吗?因为我加了movieDescription.setMovie(movie);,但还是只保存了MovieEnity。
    • 没有。 Cascade 会为您完成。它已经在保存,只是没有链接到MovieEntity
    • 这很奇怪,因为它不起作用。 zapodaj.net/b3022ab068426.png.html 保存 MovieEntity 本身。
    • 是的。调试器zapodaj.net/e6afaed97d4f0.png.html根本没有设置描述。
    • 为什么descriptions 字段在println 行为空?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多