java - 错误 : Cannot add or update a child row: a foreign key constraint fails in hibernate using mysql

标签 java mysql hibernate

我需要使用 FROM INDEX.Java 进行一对多映射以及根据需求进行多对一映射的帮助。

当我运行 demo.java 时出现以下错误

INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
Jan 01, 2014 11:55:49 PM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000399: Using default transaction strategy (direct JDBC transactions)
Jan 01, 2014 11:55:49 PM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
Hibernate: select max(pid) from project
Hibernate: insert into project (deadline, email, pname, password, pid) values (?, ?, ?, ?, ?)
Hibernate: insert into requirement (ar, fr, nfr, description, pid, rname, rid) values (?, ?, ?, ?, ?, ?, ?)
Jan 01, 2014 11:55:50 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 1452, SQLState: 23000
Jan 01, 2014 11:55:50 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Cannot add or update a child row: a foreign key constraint fails (`proj`.`requirement`, CONSTRAINT `requirement_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `project` (`pid`))
Exception in thread "main" org.hibernate.exception.ConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`proj`.`requirement`, CONSTRAINT `requirement_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `project` (`pid`))

这是我得到的错误日志

  package proj;

import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.GenericGenerator;

@Entity @Table(name="project")
public class Index {
    int pid;
    String name;
    String email;
    String password;
    String deadline;
    private transient List<Requirment> Requirment;

    public Index() {
        // TODO Auto-generated constructor stub
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setPid(int pid) {
        this.pid = pid;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public void setDeadline(String deadline) {
        this.deadline = deadline;
    }
    public void setRequirment(List<Requirment> requirment) {
        Requirment = requirment;
    }

    /////////////////////////////////////////////
    @Column (name="pname")
    public String getName() {
        return name;
    }
    @Id
    @GeneratedValue(generator="increment")
    @GenericGenerator(name="increment", strategy = "increment")
    @Column(name = "pid")
    public int getPid() {
        return pid;
    }
    @Column (name="deadline")
    public String getDeadline() {
        return deadline;
    }
    @Column (name="email")
    public String getEmail() {
        return email;
    }
    @Column (name="password")
    public String getPassword() {
        return password;
    }
    @OneToMany(fetch=FetchType.EAGER, mappedBy="ind")
    //@Cascade({org.hibernate.annotations.CascadeType.ALL})
    public List<Requirment> getRequirment() {
        return Requirment;
    }

}

这是 INDEX.JAVA

    import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.GenericGenerator;

@Entity @Table(name="requirement")
public class Requirment {
    int pid;
    int rid;
    String rname;
    String desp;
    boolean FR;
    boolean NFR;
    boolean AR;
    private transient Index ind;

    public void setAR(boolean aR) {
        AR = aR;
    }
    public void setDesp(String desp) {
        this.desp = desp;
    }
    public void setFR(boolean fR) {
        FR = fR;
    }
    public void setNFR(boolean nFR) {
        NFR = nFR;
    }
    public void setPid(int pid) {
        this.pid = pid;
    }
    public void setRid(int rid) {
        this.rid = rid;
    }
    public void setRname(String rname) {
        this.rname = rname;
    }
    public void setInd(Index ind) {
        this.ind = ind;
    }

    public Requirment() {
        // TODO Auto-generated constructor stub
    }


    @Column (name="description")
    public String getDesp() {
        return desp;
    }
    @Column (name="pid")
    public int getPid() {
        return pid;
    }
    @Column (name="rname")
    public String getRname() {
        return rname;
    }
    @Id
    @Column (name="rid")
    public int getRid() {
        return rid;
    }
    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name="pid", nullable=false, insertable=false, updatable=false)
    public Index getInd() {
        return ind;
    }

    @Column (name="fr")
    public boolean getFR() {
        return this.FR;
    }
    @Column (name="ar")
    public boolean getAR() {
        return this.AR;
    }
    @Column (name="nfr")
    public boolean getNFR() {
        return this.NFR;
    }

}

这是要求.JAVA

public class demo {

    public static void main(String[] args) 
    {
        Index temp=new Index();
        //temp.setPid(9);
        temp.setName("SRE");
        temp.setEmail("123@hotmail.com");
        temp.setPassword("1234");
        temp.setDeadline("20/12/13");


        //DataAccessUtil.del(Index.class, 1);
        Requirment req=new Requirment();
        req.setInd(temp);
        req.setPid(temp.pid);
        req.setAR(false);
        req.setNFR(false);
        req.setFR(true);
        req.setRname("testing");
        req.setDesp("testing phase at night");
        req.setRid(1);
        DataAccessUtil.save(temp);
        //temp.getRequirment().add(req);
        DataAccessUtil.save(req);

    }


}

这是demo.java

    create database project;
use project;

create table project( pid int(4) PRIMARY KEY, password varchar(50) , pname varchar(50), email varchar(50) , deadline varchar(50));

create table requirement( pid int(4) NOT NULL, rid int(4), rname text, description text, fr
tinyint(1), nfr tinyint(1),  ar tinyint(1), FOREIGN KEY (pid) REFERENCES project(pid)
        ON DELETE CASCADE );

这是 SQL 脚本

最佳答案

如果您声明 Requirement.ind @ManyToOne 与 insertable=false, updatable=false 关联,它如何工作? 这实质上意味着它是只读的。

我也看到了该列的 pid 原语,但在您的示例中,您在 tempreq.setPid(temp.pid) > 实际上被保存了。 所以这没有任何意义。

您可以有以下解决方案:

  1. 从 Requirement.ind @ManyToOne 关联中删除 insertable=false, updatable=false。 删除 Requirement.pid 属性,因为它似乎根本没有任何意义(您始终可以使用 Requirement.ind.getPid)。
  2. 使用 req.setPid(temp.pid);保存 temp 之后(即分配 temp.pid)

关于java - 错误 : Cannot add or update a child row: a foreign key constraint fails in hibernate using mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20872181/

相关文章:

java - 构建完整的复选框节点树

java - Lambda 表达式函数式编程

mysql - SQL 模式级别约束

mysql - phpMyAdmin 例程未显示

php - 如何在下一个查询中使用选择选项值作为 PHP 变量?

Spring Data JPA - 多个 EnableJpaRepositories

java相当于swfobject

java - 是否可以将包含特定数量引用的数组作为参数传递给函数?

java - 如何克服未发现转换器错误

java - Hibernate hbm 文件中的过滤机制对于动态谓词不是很灵活