【问题标题】:Error: "Key is not present in table" when inserting new data @ManyToMany错误:插入新数据@ManyToMany 时“表中不存在键”
【发布时间】:2021-07-13 21:21:28
【问题描述】:

我是新手,所以我希望我能正确解释这一点。我有一个具有用户注册/登录和用户角色的项目。现在我想制作一个 ToDo 功能,用户可以在其中完成自己的任务。我想在“任务”和“用户”之间建立@ManyToMany 关系。

当我创建一个新任务时,一切正常,直到我想在数据库的“tasks_users”中创建一个新行,这里出现错误:Key (task_id)=(35) is not present in table "users".

这是我的用户模型:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "first_name")
private String firstName;

@Column(name = "last_name")
private String lastName;


private String email;
private String password;

@ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.PERSIST})
@JoinTable(
        name = "users_roles",
        joinColumns = @JoinColumn(
                name = "user_id", referencedColumnName = "id"),
        inverseJoinColumns = @JoinColumn(
                name = "role_id", referencedColumnName = "id"))

private Collection<Role> roles;

// constructors:
public User(){
    // default constructor
}

public User(String firstName, String lastName, String email, String password, Collection<Role> roles) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.email = email;
    this.password = password;
    this.roles = roles;
}

// getters and setters:

以及任务模型:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

@Column(name = "name")
private String taskName;

@Column(name = "description")
private String taskDesc;

@Column(name = "target_date")
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="dd-MM-yyyy")
private Date targetDate;

@ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.PERSIST, CascadeType.ALL})
@JoinTable(
        name = "tasks_users",
        joinColumns = @JoinColumn(
                name = "task_id", referencedColumnName = "id"),
        inverseJoinColumns = @JoinColumn(
                name = "user_id", referencedColumnName = "id"))

private Collection<User> users;

public Task() {
    super();
}

public Task(String taskName, String taskDesc, Date targetDate, Collection<User> users) {
    super();
    this.taskName = taskName;
    this.taskDesc = taskDesc;
    this.targetDate = targetDate;
    this.users = users;
}

当我添加一个新任务时,这是我在错误之后得到的代码:

`select user0_.id as id1_3_, user0_.email as email2_3_, user0_.first_name as first_na3_3_, 
user0_.last_name as last_nam4_3_, user0_.password as password5_3_ from users user0_ where user0_.email=
binding parameter [1] as [VARCHAR] - [email]
extracted value ([id1_3_] : [BIGINT]) - [2]
extracted value ([email2_3_] : [VARCHAR]) - [email]
extracted value ([first_na3_3_] : [VARCHAR]) - [name]
extracted value ([last_nam4_3_] : [VARCHAR]) - [name]
extracted value ([password5_3_] : [VARCHAR]) - [$2a$10$0JQutx1DVWaPhiJGGhdQlO8pm7BtOviSh6srTmKrmIk4WOnL9VGb6]`

Created collection wrapper: [nl.eind.java.backend.model.User.roles#2]

select roles0_.user_id as user_id1_4_0_, roles0_.role_id as role_id2_4_0_, role1_.id as id1_0_1_, 
role1_.name as name2_0_1_ from users_roles roles0_ inner join role role1_ on 
roles0_.role_id=role1_.id 
where roles0_.user_id=?

binding parameter [1] as [BIGINT] - [2]
extracted value ([id1_0_1_] : [BIGINT]) - [1]
extracted value ([name2_0_1_] : [VARCHAR]) - [ROLE_ADMIN]
extracted value ([user_id1_4_0_] : [BIGINT]) - [2]
extracted value ([role_id2_4_0_] : [BIGINT]) - [1]


insert into tasks (target_date, description, name) values (?, ?, ?)
binding parameter [1] as [TIMESTAMP] - [Tue Apr 06 00:00:00 CEST 2021]
binding parameter [2] as [VARCHAR] - [d]
binding parameter [3] as [VARCHAR] - [d]

insert into tasks_users (task_id, user_id) values (?, ?)
binding parameter [1] as [BIGINT] - [35]
binding parameter [2] as [BIGINT] - [2]


SQL Error: 0, SQLState: 23503
ERROR: insert or update on table "tasks_users" violates foreign key constraint "fk4jyg0wr5a9mher3c5ys65wefu"
Detail: Key (task_id)=(35) is not present in table "users".
HHH000010: On release of batch it still contained JDBC statements

org.postgresql.util.PSQLException: ERROR: insert or update on table "tasks_users" violates foreign key 
constraint "fk4jyg0wr5a9mher3c5ys65wefu"
Detail: Key (task_id)=(35) is not present in table "users".

【问题讨论】:

    标签: java spring postgresql spring-boot spring-data


    【解决方案1】:
    @JoinTable(
            name = "tasks_users",
            joinColumns = @JoinColumn(
                    name = "task_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(
                    name = "user_id", referencedColumnName = "id"))
    

    该部分应仅位于这 2 个实体中的 1 个上。用户或任务。拥有该部分代码 (@JoinTable) 的实体将是拥有该关系的部分。

    如此处所述java ee - spec

    指定关联的映射。 适用于拥有 关联的一面

    【讨论】:

    • 很抱歉我阅读了文档,但我仍然不明白我应该做什么......
    • 从这两个侧面之一删除 @JoinTable(.....)
    猜你喜欢
    • 2021-06-21
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多