首页 > 解决方案 > 无法添加或更新子行:尝试保存实体及其关系实体时出现外键约束失败错误

问题描述

好吧,我的数据库中有以下表格:

CREATE TABLE movie (
movie_id INTEGER NOT NULL AUTO_INCREMENT,
translated_title VARCHAR(150),
original_title VARCHAR(150),
plot MEDIUMTEXT,
genre VARCHAR(150),
country VARCHAR(250),
language VARCHAR(100),
upvotes INTEGER,
premiere_year INTEGER(4),
duration_minutes Integer,
CONSTRAINT movie_pk PRIMARY KEY (movie_id));

CREATE TABLE actor (
actor_id INTEGER NOT NULL AUTO_INCREMENT,
name VARCHAR(150),
nationality VARCHAR(150),
born_date DATE,
CONSTRAINT actor_pk PRIMARY KEY (actor_id));

CREATE TABLE actor_movie (
actor_id INTEGER,
movie_id INTEGER,
FOREIGN KEY (actor_id) REFERENCES actor (actor_id) ON DELETE CASCADE,
FOREIGN KEY (movie_id) REFERENCES movie (movie_id) ON DELETE CASCADE);

和以下实体:

@Entity(name = "movie")
public class Movie implements Serializable {    

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "actor_movie",
        inverseJoinColumns  = { @JoinColumn(name = "actor_id", insertable = true, updatable = true)},
        joinColumns = { @JoinColumn(name = "movie_id", insertable = true, updatable = true) })
private Set<Actor> actors;

和:

@Entity(name = "actor")
public class Actor implements Serializable {

@ManyToMany(mappedBy="actors")
private Set<Movie> movies;

当我创建一个 Movie 对象并设置所有属性(包括一个 Actor)并调用 save 方法时,我得到:“无法添加或更新子行:外键约束失败(movieow. actor_movie, CONSTRAINT FKsc6u9gs0762qyrnyfwp9d5q2bFOREIGN KEY ( movie_id) REFERENCES actor( actor_id))”

我想当我保存一个 Movie 对象时,它会级联地保存 actor 和 actor_movie 表。

我究竟做错了什么?

标签: javahibernatejpa

解决方案


这听起来像是不同实体不同步的问题(我没有针对您的情况进行测试)。这个想法是为您的集合创建添加和删除方法,这些方法在相应的关联对象中添加或删除实体。有关@ManyToMany关系的明确示例,您可以查看Vlad Mihalcea 关于这些关系的文章。关于同步和级联,他还写了一篇文章


推荐阅读