Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:无法添加或更新子行:外键约束失败_Java_Mysql_Hibernate_Jpa - Fatal编程技术网

Java com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:无法添加或更新子行:外键约束失败

Java com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:无法添加或更新子行:外键约束失败,java,mysql,hibernate,jpa,Java,Mysql,Hibernate,Jpa,当我想插入一些数据时,我总是出错 项目类 @Entity @NamedQueries({ @NamedQuery(name = "Project.findAll", query = "SELECT p FROM Project p"), @NamedQuery(name = "Project.findByTitle", query = "SELECT p FROM Project p WHERE p.title =

当我想插入一些数据时,我总是出错

项目类

@Entity
@NamedQueries({
        @NamedQuery(name = "Project.findAll",
         query = "SELECT p FROM Project p"),
        @NamedQuery(name = "Project.findByTitle",
                query = "SELECT p FROM Project p WHERE p.title = :title")
})
public class Project implements Serializable{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int projectId;

    @Column
    private String title;
    @Column
    private String description;
    @Column
    private Date projectDate;

    @ManyToOne
    @JoinColumn(name = "projectStatusId")
    private ProjectStatus projectStatus;

    @OneToMany(mappedBy = "projectMemberId",fetch = FetchType.EAGER)
    private List<ProjectMember> memberList = new ArrayList<ProjectMember>();

    /**
     * Setters and Getters
     */
}
@Entity
@NamedQueries({
        @NamedQuery(name = "ProjectMember.findAll",
                query = "SELECT pm FROM ProjectMember pm"),
        @NamedQuery(name = "ProjectMember.findByProject",
                query = "SELECT pm FROM ProjectMember pm WHERE pm.project = :project"),
        @NamedQuery(name = "ProjectMember.findByUser",
                query = "SELECT pm FROM ProjectMember pm WHERE pm.user = :user"),
        @NamedQuery(name = "ProjectMEmeber.findByUserAndProject",
                query = "SELECT pm FROM ProjectMember pm  WHERE pm.user = :user AND pm.project = :project")
})

public class ProjectMember implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int projectMemberId;


    @Column
    private Date activationDate;
    @Column
    private Date lastActiveDate;

    @ManyToOne
    @JoinColumn(name = "memberStatusId")
    private MemberStatus memberStatus;

    @ManyToOne
    @JoinColumn(name = "projectId")
    private Project project;


    @ManyToOne
    @JoinColumn(name = "memberRoleId")
    private MemberRole memberRole;

    @ManyToOne
    @JoinColumn(name = "userId")
    private User user;

    /**
     * Setter and Getter
     */
}
public String createProject(){
    project.setProjectDate(new Date());
    project.setProjectStatus(new ProjectStatusFacade().findByStatus("active"));

    ProjectMember projectMember = new ProjectMember();
    projectMember.setMemberStatus(new MemberStatusFacade().findByStatus("accepted"));
    projectMember.setMemberRole(new MemberRoleFacade().findByRole("team leader"));
    projectMember.setActivationDate(new Date());
    projectMember.setUser(userSession.getUser());

    new ProjectFacade().create(project);
    System.out.print(project);
    projectMember.setProject(project);
    new ProjectMemberFacade().create(projectMember);

    userSession.setUser(new UserFacade().findById(userSession.getUser().getUserId()));
    return "index?faces-redirect=true";
}
@ManyToOne
    @JoinColumn(name = "projectStatusId")
    private ProjectStatus projectStatus;
我就是这样做的

项目控制器类

@Entity
@NamedQueries({
        @NamedQuery(name = "Project.findAll",
         query = "SELECT p FROM Project p"),
        @NamedQuery(name = "Project.findByTitle",
                query = "SELECT p FROM Project p WHERE p.title = :title")
})
public class Project implements Serializable{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int projectId;

    @Column
    private String title;
    @Column
    private String description;
    @Column
    private Date projectDate;

    @ManyToOne
    @JoinColumn(name = "projectStatusId")
    private ProjectStatus projectStatus;

    @OneToMany(mappedBy = "projectMemberId",fetch = FetchType.EAGER)
    private List<ProjectMember> memberList = new ArrayList<ProjectMember>();

    /**
     * Setters and Getters
     */
}
@Entity
@NamedQueries({
        @NamedQuery(name = "ProjectMember.findAll",
                query = "SELECT pm FROM ProjectMember pm"),
        @NamedQuery(name = "ProjectMember.findByProject",
                query = "SELECT pm FROM ProjectMember pm WHERE pm.project = :project"),
        @NamedQuery(name = "ProjectMember.findByUser",
                query = "SELECT pm FROM ProjectMember pm WHERE pm.user = :user"),
        @NamedQuery(name = "ProjectMEmeber.findByUserAndProject",
                query = "SELECT pm FROM ProjectMember pm  WHERE pm.user = :user AND pm.project = :project")
})

public class ProjectMember implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int projectMemberId;


    @Column
    private Date activationDate;
    @Column
    private Date lastActiveDate;

    @ManyToOne
    @JoinColumn(name = "memberStatusId")
    private MemberStatus memberStatus;

    @ManyToOne
    @JoinColumn(name = "projectId")
    private Project project;


    @ManyToOne
    @JoinColumn(name = "memberRoleId")
    private MemberRole memberRole;

    @ManyToOne
    @JoinColumn(name = "userId")
    private User user;

    /**
     * Setter and Getter
     */
}
public String createProject(){
    project.setProjectDate(new Date());
    project.setProjectStatus(new ProjectStatusFacade().findByStatus("active"));

    ProjectMember projectMember = new ProjectMember();
    projectMember.setMemberStatus(new MemberStatusFacade().findByStatus("accepted"));
    projectMember.setMemberRole(new MemberRoleFacade().findByRole("team leader"));
    projectMember.setActivationDate(new Date());
    projectMember.setUser(userSession.getUser());

    new ProjectFacade().create(project);
    System.out.print(project);
    projectMember.setProject(project);
    new ProjectMemberFacade().create(projectMember);

    userSession.setUser(new UserFacade().findById(userSession.getUser().getUserId()));
    return "index?faces-redirect=true";
}
@ManyToOne
    @JoinColumn(name = "projectStatusId")
    private ProjectStatus projectStatus;
这就是我最后得到的

 Caused by: javax.faces.el.EvaluationException: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement
        ... more exceptions

    Caused by: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement
        ... more exceptions

    Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement
        ...more exceptions

    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`goent`.`projectmember`, CONSTRAINT `FKfyw2iinfhhsbrmqbu1sr7l93q` FOREIGN KEY (`projectMemberId`) REFERENCES `project` (`projectId`))
        ... more exceptions

    15:51:06,449 ERROR [io.undertow.request] (default task-4) UT005023: Exception handling request to /hibernate/pages/project-add-member.xhtml: javax.servlet.ServletException: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement
        ... more exceptions

    Caused by: javax.faces.el.EvaluationException: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement
        ... more exceptions

    Caused by: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement
        ...more exceptions
    Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement
        ... more exceptions

    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`goent`.`projectmember`, CONSTRAINT `FKfyw2iinfhhsbrmqbu1sr7l93q` FOREIGN KEY (`projectMemberId`) REFERENCES `project` (`projectId`))
        ... more exceptions

使用:Java、JPA、Hibernate、MySQL5.7时,异常的原因是:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`goent`.`projectmember`, CONSTRAINT `FKfyw2iinfhhsbrmqbu1sr7l93q` FOREIGN KEY (`projectMemberId`) REFERENCES `project` (`projectId`))

您的操作违反了projectmember表中projectMemberId列的外键约束,该列根据您定义的规范引用了project表的projectId

这是最有可能发生的事情

项目
实体中,您告诉持久性提供程序总是急切地获取
项目名称

@OneToMany(mappedBy = "projectMemberId",fetch = FetchType.EAGER)
private List<ProjectMember> memberList = new ArrayList<ProjectMember>();

谢谢大家,我终于可以修复这个错误了。问题出在项目课上,是关于不正确的映射。我并没有告诉变量映射到另一个类中,而是指向那个类的PK

这是我写的

项目类

@Entity
@NamedQueries({
        @NamedQuery(name = "Project.findAll",
         query = "SELECT p FROM Project p"),
        @NamedQuery(name = "Project.findByTitle",
                query = "SELECT p FROM Project p WHERE p.title = :title")
})
public class Project implements Serializable{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int projectId;

    @Column
    private String title;
    @Column
    private String description;
    @Column
    private Date projectDate;

    @ManyToOne
    @JoinColumn(name = "projectStatusId")
    private ProjectStatus projectStatus;

    @OneToMany(mappedBy = "projectMemberId",fetch = FetchType.EAGER)
    private List<ProjectMember> memberList = new ArrayList<ProjectMember>();

    /**
     * Setters and Getters
     */
}
@Entity
@NamedQueries({
        @NamedQuery(name = "ProjectMember.findAll",
                query = "SELECT pm FROM ProjectMember pm"),
        @NamedQuery(name = "ProjectMember.findByProject",
                query = "SELECT pm FROM ProjectMember pm WHERE pm.project = :project"),
        @NamedQuery(name = "ProjectMember.findByUser",
                query = "SELECT pm FROM ProjectMember pm WHERE pm.user = :user"),
        @NamedQuery(name = "ProjectMEmeber.findByUserAndProject",
                query = "SELECT pm FROM ProjectMember pm  WHERE pm.user = :user AND pm.project = :project")
})

public class ProjectMember implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int projectMemberId;


    @Column
    private Date activationDate;
    @Column
    private Date lastActiveDate;

    @ManyToOne
    @JoinColumn(name = "memberStatusId")
    private MemberStatus memberStatus;

    @ManyToOne
    @JoinColumn(name = "projectId")
    private Project project;


    @ManyToOne
    @JoinColumn(name = "memberRoleId")
    private MemberRole memberRole;

    @ManyToOne
    @JoinColumn(name = "userId")
    private User user;

    /**
     * Setter and Getter
     */
}
public String createProject(){
    project.setProjectDate(new Date());
    project.setProjectStatus(new ProjectStatusFacade().findByStatus("active"));

    ProjectMember projectMember = new ProjectMember();
    projectMember.setMemberStatus(new MemberStatusFacade().findByStatus("accepted"));
    projectMember.setMemberRole(new MemberRoleFacade().findByRole("team leader"));
    projectMember.setActivationDate(new Date());
    projectMember.setUser(userSession.getUser());

    new ProjectFacade().create(project);
    System.out.print(project);
    projectMember.setProject(project);
    new ProjectMemberFacade().create(projectMember);

    userSession.setUser(new UserFacade().findById(userSession.getUser().getUserId()));
    return "index?faces-redirect=true";
}
@ManyToOne
    @JoinColumn(name = "projectStatusId")
    private ProjectStatus projectStatus;
而是这个

//Correct code
@ManyToOne
    @JoinColumn(name = "project")
    private ProjectStatus projectStatus;
在这一更改之后,代码开始正常工作