繁体   English   中英

无法添加或更新子行:使用Hibernate Framework,外键约束失败

[英]Cannot add or update a child row: a foreign key constraint fails using Hibernate Framework

有没有人可以帮助我解决这个问题?

我试图一次在系统中保存一个学生的记录,然后将其保存到数据库中的其他表中,但是保存时出现错误。

它涉及4个类,即Personalinfo.java (父类), Student.java (子类扩展Personalinfo.java), Students_Credentials.java (链接到Student.java)和ManageStudent.class (包含保存学生记录的方法)。

错误

数据库设计

继承人代码:

PersonalInfo.java

//PersonalInfo.java

@Entity
@Table(name="personal_info")
@Inheritance(strategy=InheritanceType.JOINED)  
public class Personalinfo {
  @Id
  @GeneratedValue
  @Column(name="personalid")
  private long personalUID;
  @Column(name="lastname")
  private String lastname;
  @Column(name="firstname")
  private String firstname;
  @Column(name="middlename")
  private String middlename;
  @Column(name="Suffix")
  private String suffix;
  @Column(name="gender")
  private String gender;
  @Column(name="homeaddress")
  private String homeaddress;
  @Column(name="birthdate")
  private String birthdate;
  @Column(name="bloodtype")
  private String bloodtype;
  @Column(name="contactno")
  private String contactno;
  @Column(name="email")
  private String email;
  @Column(name="cplastname")
  private String cplastname;
  @Column(name="cpfirstname")
  private String cpfirstname;
  @Column(name="cpmiddlename")
  private String cpmiddlename;
  @Column(name="cphomeaddress")
  private String cphomeaddress;
  @Column(name="cpcontactno")
  private String cpcontactno;
  @Column(name="photo")
  private Blob photo;
  @Column(name="note")
  private String note;

  //(Netbeans)Automated Get & Set Method..

}

学生.java

//Student.java

@Entity
@Table(name="student")
@PrimaryKeyJoinColumn(name="personalid") 

public class Student extends Personalinfo {

    @Column(name="studentidno",unique=true,nullable=false)
    private String stud_id;

    @Column(name="gradeschool")
    private String grade_school;

    @Column(name="gs_aygraduated")
    private String gs_ay_graduated;

    @Column(name="highschool")
    private String high_school;

    @Column(name="hs_aygraduated")
    private String hs_ay_graduated;

    @Column(name="college")
    private String College;

    @Column(name="c_aygraduated")
    private String c_ay_graduated;

    //(Netbeans)Automated Get & Set Method..

}

Students_Credentials.java

@Entity
@Table(name="students_credentials")

public class Students_Credentials {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="studentscredentialsid",unique=true,nullable=false)
    private long stud_credentials_id;

    @Column(name="credentialsnamesubmitted")
    private String credentials_name_submitted;


    @ManyToOne(optional = false)
    @JoinColumn(name="studentidno")
    private Student Student;

   //(Netbeans)Automated Get & Set Method..

}

ManageStudent.java

public static void addStudent(String Lastname,String Firstname,String Middlename,String Suffix,String ContactNo.......)
  {
    Session session = NewHibernateUtil.getSessionFactory().openSession();
    Transaction tx = null;
    try
    {
        //***personal_info table(Parent Class) and student table(Student Class extends Personal_info Class) ***

        tx = session.beginTransaction();   
        Student stud=new Student();
        stud.setLastname(Lastname);
        stud.setFirstname(Firstname);
        stud.setMiddlename(Middlename);
        stud.setSuffix(Suffix);
        stud.setGender(Gender);
        stud.setGender(Gender);
        stud.setHomeaddress(HomeAddress);
        stud.setBirthdate(Birthdate);
        stud.setContactno(ContactNo);
        stud.setEmail(Email);
        stud.setCplastname(CPLastname);
        stud.setCpfirstname(CPFirstname);
        stud.setCpmiddlename(CPMiddlename);
        stud.setCphomeaddress(CPHomeAddress);
        stud.setCpcontactno(CPContactNo);
        stud.setPhoto(Photo);
        stud.setNote(Note);
        stud.setStud_id(IDno);
        stud.setGrade_school(GradeSchool);
        stud.setGs_ay_graduated(GSAYGraduated);
        stud.setHigh_school(HighSchool);
        stud.setHs_ay_graduated(HSAYGraduated);
        stud.setCollege(College);
        stud.setC_ay_graduated(CollAYGraduated);


        //***students_credentials table(Students_Credentials class)***

        Students_Credentials Stud_Cred0=new Students_Credentials("Form 138");
        Students_Credentials Stud_Cred1=new Students_Credentials("NSO");
        Students_Credentials Stud_Cred2=new Students_Credentials("HD");

        Stud_Cred0.setStudent(stud);
        Stud_Cred1.setStudent(stud);
        Stud_Cred2.setStudent(stud);

        session.persist(stud);

        session.persist(Stud_Cred0);
        session.persist(Stud_Cred1);
        session.persist(Stud_Cred2);


        tx.commit();
    }
    catch (HibernateException e)
    {
      if (tx != null) {
        tx.rollback();
      }
      e.printStackTrace();
    }
    finally
    {
      session.close();
    }
  }

这个评论太长了,我想格式化一些代码。 这不是一个完整的答案,这是我在思考如何解决此问题。

造成您的错误是因为Hibernate试图保存StudentCredentials对象,但没有附加附带的Student对象上的ID。 ID不存在,或者由于某种原因与学生对象上的ID不匹配。

我从未亲自管理过Hibernate事务和会话。 我一直在Spring内使用Hibernate,它为我管理事务。

如果我不得不猜测(我强调,这是一个完整的猜测),我会说你必须做以下事情。

create Student
save student
commit **this should put a generated id on the student record**
set Student on Student_Credentials objects
save Student Credentials objects

请注意,如果您单独使用Hibernate,那是您的决定,但是,如果您可以选择将Hibernate与Spring之类的东西集成在一起,以便为您管理所有细节和样板,通常会使您的生活更轻松。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM