JPA 参照完整性约束违规 oneToMany 和批量操作查询

2024-02-16

My domain model diagram looks like this: Domain Model Abstract

正如您所看到的,我在学生和出勤之间以及出勤和研讨会之间有一个一对多的关系。

下面是学生类和出勤类,以及我的帮助类(初始化程序)。

package com.seminars.domain;

import java.util.Calendar;
import java.util.HashSet;
import java.util.Set;

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

import org.hibernate.annotations.GenericGenerator;

import com.seminars.util.SimpleCalendar;


@Entity
@Table(name="Student")
public class Student {
    /*start all class fields*/
    @Id
    //@GenericGenerator(name="kaugen" , strategy="increment")
    //@GeneratedValue(generator="kaugen")
    @Column(name="studentId")
    //@GeneratedValue(strategy=GenerationType.AUTO)
    private int studentId;  

    @Column(name="firstname", length=50, nullable = false)
    private String firstname;
    @Column(name="lastname", length=50, nullable = false)
    private String lastname;
    @Column(name="email", length=50, nullable = false)
    private String email;
    @Column(name="username", length=50, nullable = false)
    private String username;
    @Column(name="password", length=50, nullable = false)
    private String password;
    @Column(name="idCard", length=50, nullable = false)
    private String idCard;
    /* end fields*/

    @OneToMany(mappedBy = "student",cascade=CascadeType.ALL) 
    private Set<Attendance> attendance = new HashSet<Attendance>() ; 



    /**
     * default constructor 
     */
    public Student(){

    }

    /**
     * Secondary Constructor to automatically create a Student 
     * @param firstname
     * @param lastname
     * @param email
     * @param username
     * @param password
     * @param idcard
     */
    public Student(String firstname,String lastname,String email, String username,String password, String idcard){
        this.setFirstname(firstname);
        this.setLastname(lastname);
        this.setEmail(email);
        this.setIdCard(idcard);
        this.setPassword(password);
        this.setUsername(username);

    }

    public int getStudentId() {
        return studentId;
    }

    public void setStudentId(int studentId) {
        this.studentId = studentId;
    }

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getIdCard() {
        return idCard;
    }

    public void setIdCard(String idCard) {
        this.idCard = idCard;
    }

    /*Methods for connecting Student<------->Attendance*/

    /**
     * @return a new hashset contain 
     * <p>all attendances of the student
     */
    public HashSet<Attendance> getAttendance(){
        return  new HashSet<Attendance>(attendance);        
    }

    /**
     * @param attendance
     * @param seminar
     */
    public void addAttendance(Attendance attendance, Seminar seminar){
        if(attendance!=null & seminar!=null){
            attendance.setStudent(this);
            attendance.setSeminar(seminar);     
            attendance.setRegisterDate((new SimpleCalendar(Calendar.getInstance()))); /* xreiazomaste na orizete I timi apo to sistima automata*/
        }

    }

    /**
     * @param attendance to remove from HashSet
     */
    public void removeAttendance(Attendance attendance){
        attendance.setStudent(null);
    }

    /**
     * @return Attendance HashSet
     */
    public Set<Attendance> findAttendance(){
        return attendance; 
    }

    /* (non-Javadoc)
     * @see java.lang.Object#equals(java.lang.Object)
     */
    public boolean equals(Object other) {
        if ( other == null) {
            return false;
        }
        if (this == other) {
            return true;
        }
        if (! (other instanceof Student)) {
            return false;
        }

        Student theStudent = (Student) other;
        //Integer a=getStudentId();
        //Integer b=theStudent.getStudentId();
        if(!(getIdCard()==null) ? theStudent.getIdCard()==null : getIdCard().equals(theStudent.getIdCard())){
            return false;        
        }
        return true;  
    }

    /* (non-Javadoc)
     * @see java.lang.Object#hashCode()
     */
    public int hashCode() {
        return idCard == null ? 0 : idCard.hashCode();
    }





}

出勤班

/**
 * 
 */
package com.seminars.domain;

import java.util.Calendar;
import java.util.HashSet;
import java.util.Set;

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

import org.junit.Assert;
import org.junit.Test;

import com.seminars.util.SimpleCalendar;


/**
 * @author Ilias
 *
 */
@Entity
@Table(name = "Attendance")
public class Attendance {

    public Attendance() {
        this.registerDate=new SimpleCalendar(Calendar.getInstance());
    }

    @Id
    @Column(name="attendanceId")
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int attendanceId;   

    @Column(name = "registerDate", length = 200, nullable = false)
    //@Temporal(TemporalType.DATE)
    @org.hibernate.annotations.Type(
            type="com.seminars.persistence.SimpleCalendarCustomType")
    private SimpleCalendar registerDate;

    @Column(name = "success")
    private boolean success;

    @ManyToOne
    @JoinColumn(name="studentId", nullable = false)
    private Student student;

    @OneToMany(mappedBy = "attendance",cascade=CascadeType.ALL)  
    private Set<Absence> absence = new HashSet<Absence>() ; 

    @ManyToOne
    @JoinColumn(name="seminarId", nullable = false)
    private Seminar seminar;

    @OneToMany(mappedBy = "attendance",cascade=CascadeType.ALL)  
    private Set<Payment> payment = new HashSet<Payment>() ;/*<<<*/

    public SimpleCalendar getRegisterDate() {
        return registerDate;
    }

    public void setRegisterDate(SimpleCalendar registerDate) {
        this.registerDate = registerDate;
    }

    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    /**
     * @return the student
     */
    public Student getStudent() {
        return student;
    }

    /**
     * @param student the student to set
     */
    public void setStudent(Student student) {
        //this.student = student.findAttendance().add(this);
        if (this.student != null) {
            this.student.findAttendance().remove(this);
        }
        this.student = student;
        if (this.student != null) {
            this.student.findAttendance().add(this);
        }
    }

    /**
     * @return the seminar
     */
    public Seminar getSeminar() {
        return seminar;
    }

    /**
     * @param seminar the seminar to set
     */
    public void setSeminar(Seminar seminar) {
        //this.student = student.findAttendance().add(this);
                if (this.seminar != null) {
                    this.seminar.findAttendance().remove(this);
                }
                this.seminar = seminar;
                if (this.seminar != null) {
                    this.seminar.findAttendance().add(this);
                }
    }

    public HashSet<Absence> getAbsence(){
        return  new HashSet<Absence>(absence);
    }

    public void addAbsence(Absence absence, SimpleCalendar date){
        if(absence!=null && date!=null){
            absence.setAttendance(this);
            /*stelnoume tin imerominia pou kataxorei I gramamteia oti elipe o foititis*/
            absence.setDate(date);
        }       

    }

    /**
     * @return Absence HashSet
     */
    public Set<Absence> findAbsence(){
        return absence; 
    }

    /**
     * @return HashSet<Payment>
     */
    public HashSet<Payment> getPayment(){
        return  new HashSet<Payment>(payment);
    }

    public void addPayment(Payment payment, SimpleCalendar date){
        if(payment!=null && date!=null){
            payment.setAttendance(this);
            /*stelnoume tin imerominia pou kataxorei I gramamteia oti elipe o foititis*/
            //absence.setDate(date);
        }           
    }
    /**
     * @return Payment HashSet
     */
    public Set<Payment> findPayment(){
        return payment; 
    }

    /* (non-Javadoc)
     * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(Object other) {
        if ( other == null) {
            return false;
        }
        if (this == other) {
            return true;
        }
        if (! (other instanceof Attendance)) {
            return false;
        }

        Attendance theAttendance = (Attendance) other;
        //Integer a=getStudentId();
        //Integer b=theStudent.getStudentId();
        if(!(getStudent()==null) ? theAttendance.getStudent()==null : getStudent().equals(theAttendance.getStudent())){
            return false;        
        }
        if(!(getSeminar()==null) ? theAttendance.getSeminar()==null : getSeminar().equals(theAttendance.getSeminar())){
            return false;        
        }
        return true;  
    }

    /* (non-Javadoc)
     * @see java.lang.Object#hashCode()
     */
    public int hashCode() {
        if(student==null && seminar==null){
            return 0;
        }
        else {
            int result=0;
            if(student!=null)
                result+= 13*getStudent().hashCode()/*+getSeminar().hashCode()*/;            
            if(seminar!=null)
                result+= 13*getSeminar().hashCode();            
            return result;
        }
        /*int result = 0;
        result = getStudent() == null ? result : 13 * result + getStudent().hashCode(); 
        result = getSeminar() == null ? result : 13 * result + getSeminar().hashCode();
        return result;  */

    }


}

初始化类

    package com.seminars.persistence;

import java.util.Calendar;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.Query;

import com.seminars.domain.Attendance;
import com.seminars.domain.Seminar;
import com.seminars.domain.Student;
import com.seminars.util.SimpleCalendar;




public class Initializer  {
    /* EntityManager em = DatabaseFactory.createEntityManager();
     EntityTransaction tx = em.getTransaction();*/


    //delete all data from database
    public void  eraseData() {
        EntityManager em = DatabaseFactory.getCurrentEntityManager();
        EntityTransaction tx = em.getTransaction();
        tx.begin();

        Query query = em.createNativeQuery("delete from \"Student\"");
        query.executeUpdate();
        query = em.createNativeQuery("delete from \"Absence\"");
        query.executeUpdate();
        query = em.createNativeQuery("delete from \"Attendance\"");
        query.executeUpdate();
        query = em.createNativeQuery("delete from \"Payment\"");
        query.executeUpdate();
        query = em.createNativeQuery("delete from \"Seminar\"");
        query.executeUpdate();
        query = em.createNativeQuery("delete from \"Program\"");
        query.executeUpdate();
        tx.commit();
        em.close();
    }
    public void prepareData() {

        // πριν εισάγουμε τα δεδομένα διαγράφουμε ότι υπάρχει
        eraseData();
        EntityManager em = DatabaseFactory.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        Student s1=new Student("george","antoniou","[email protected] /cdn-cgi/l/email-protection","antoniou","password","998456");
        s1.setStudentId(1);
        Student s2=new Student("ilias","butsikakis","[email protected] /cdn-cgi/l/email-protection","ilias","butsi","98756423");
        s2.setStudentId(2);
        Seminar sem1=new Seminar(1, "Java", 5,500, 2, new SimpleCalendar(2013,1,5), new SimpleCalendar(2013,2,5),"100");
        sem1.setSeminarId(1);
        Attendance att=new Attendance();
        att.setRegisterDate(new SimpleCalendar(Calendar.getInstance()));
        //s1.addAttendance(att, sem1);
        //s1=em.merge(s1);
        //s2=em.merge(s2);
        //sem1=em.merge(sem1);
        //em.persist(att);
        em.persist(s1);
        em.persist(s2);
        em.persist(sem1);
        s1.addAttendance(att, sem1);
        em.persist(att);
        s1=em.merge(s1);
        em.persist(s1);
        tx.commit();
        em.close();
    }    

    /*public void prepareData1() {
        // πριν εισάγουμε τα δεδομένα διαγράφουμε ότι υπάρχει  
        eraseData();   
        Student s1=new Student("george","antoniou","[email protected] /cdn-cgi/l/email-protection","antoniou","password","998456");
        s1.setStudentId(1);
        Student s2=new Student("ilias","butsikakis","[email protected] /cdn-cgi/l/email-protection","ilias","butsi","98756423");
        s2.setStudentId(2);
        Seminar sem1=new Seminar(1, "Java", 5,500, 2, new SimpleCalendar(2013,1,5), new SimpleCalendar(2013,2,5),"100");

        //EntityManager em = DatabaseFactory.createEntityManager();
        EntityManager em = DatabaseFactory.createEntityManager();
        EntityTransaction tx = em.getTransaction();                       
        tx.begin();
        em.persist(s1);
        em.persist(s2);
        tx.commit();
        em.close();
        /*NOTE ALWAYS REMEMBER: 
         * 1)Open entity Manager,
         * 2)Open Transaction
         * 3)Create Items
         * else You will need to use merge or you will get a detached exception!!!
         *  */
        //s1=em.merge(s1);
       /* Student s1=new Student("george","antoniou","[email protected] /cdn-cgi/l/email-protection","antoniou","password","998456");
        s1.setStudentId(1);
        Student s2=new Student("ilias","butsikakis","[email protected] /cdn-cgi/l/email-protection","ilias","butsi","98756423");
        s2.setStudentId(2);
        Seminar sem1=new Seminar(1, "Java", 5,500, 2, new SimpleCalendar(2013,1,5), new SimpleCalendar(2013,2,5),"100");
        s1=em.merge(s1);
        s2=em.merge(s2);
        sem1=em.merge(sem1);
        em.persist(s1);
        em.persist(s2);
        em.persist(sem1);
        tx.commit();
        em.close();*/

        /*EntityManagerFactory emf = Persistence.createEntityManagerFactory("library");
        EntityManager em = emf.createEntityManager();*/

    //}    

}

该项目主要通过 JUnit 测试进行检查,因此在 Initializer 类中,我们有一个PrepareData 方法,它创建一些在每次检查中使用的示例数据,以及一个删除方法,以确保每次检查都使用相同的数据完成。

在尝试检查学生和出勤之间的连接之前,一切似乎都正常。我在初始化程序中创建了一个新的出勤对象,以测试学生是否可以“正常”参加研讨会,并且我收到了很多异常消息。

我最注意到的一个(正如它在控制台中所示)是

分段阅读_第 3781 章 违反参照完整性约束:“FKE7E9BF09F9FEB38B: 公开。“出勤”外键(学生)参考资料 PUBLIC.""Student""(""studentId"")"; SQL语句:删除 “学生”[23003-135]

我检查以确保注释和级联位于正确的位置,但没有结果......

我还尝试更改项目在初始值设定项类中保存的顺序,但随后出现其他错误

**javax.persistence.PersistenceException: org.hibernate.PropertyValueException: not-null property references a null or transient value: com.seminars.domain.Attendance.seminar**
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1235)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1168)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1174)
    at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:674)
    at com.seminars.persistence.Initializer.prepareData(Initializer.java:73)
    at com.seminars.services.ManageStudentServiceTest.setup(ManageStudentServiceTest.java:60)
    at com.seminars.services.ManageStudentServiceTest.testManageStudentService(ManageStudentServiceTest.java:97)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:44)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)
    at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:220)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.hibernate.PropertyValueException: not-null property references a null or transient value: com.seminars.domain.Attendance.seminar
    at org.hibernate.engine.Nullability.checkNullability(Nullability.java:101)
    at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:313)
    at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
    at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)
    at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:69)
    at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:179)
    at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:135)
    at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:61)
    at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:800)
    at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:774)
    at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:778)
    at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:668)
    ... 27 more

以下是在更改初始值设定项类中的项目顺序之前出现的异常列表:

> javax.persistence.PersistenceException:
> org.hibernate.exception.ConstraintViolationException: could not
> execute native bulk manipulation query    at
> org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1235)
>   at
> org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1168)
>   at
> org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:1245)
>   at
> org.hibernate.ejb.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:108)
>   at
> com.seminars.persistence.Initializer.eraseData(Initializer.java:37)
>   at
> com.seminars.services.ManageStudentServiceTest.empty(ManageStudentServiceTest.java:64)
>   at
> com.seminars.services.ManageStudentServiceTest.testManageStudentService(ManageStudentServiceTest.java:99)
>   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  at
> sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)   at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)   at
> java.lang.reflect.Method.invoke(Unknown Source)   at
> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
>   at
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
>   at
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
>   at
> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
>   at
> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
>   at
> org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
>   at
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
>   at
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:44)
>   at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)
>   at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)
>   at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)
>   at
> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
>   at
> org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
>   at org.junit.runners.ParentRunner.run(ParentRunner.java:220)    at
> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
>   at
> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
>   at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
>   at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
>   at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
>   at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
> Caused by: org.hibernate.exception.ConstraintViolationException: could
> not execute native bulk manipulation query    at
> org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)
>   at
> org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
>   at
> org.hibernate.engine.query.NativeSQLQueryPlan.performExecuteUpdate(NativeSQLQueryPlan.java:219)
>   at
> org.hibernate.impl.SessionImpl.executeNativeUpdate(SessionImpl.java:1300)
>   at
> org.hibernate.impl.SQLQueryImpl.executeUpdate(SQLQueryImpl.java:365)
>   at
> org.hibernate.ejb.QueryImpl.internalExecuteUpdate(QueryImpl.java:183)
>   at
> org.hibernate.ejb.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:99)
>   ... 27 more Caused by: org.h2.jdbc.JdbcSQLException: Referential
> integrity constraint violation: "FKE7E9BF09F9FEB38B:
> PUBLIC.""Attendance"" FOREIGN KEY(STUDENT) REFERENCES
> PUBLIC.""Student""(""studentId"")"; SQL statement: delete from
> "Student" [23003-135]     at
> org.h2.message.DbException.getJdbcSQLException(DbException.java:327)
>   at org.h2.message.DbException.get(DbException.java:167)     at
> org.h2.message.DbException.get(DbException.java:144)  at
> org.h2.constraint.ConstraintReferential.checkRow(ConstraintReferential.java:378)
>   at
> org.h2.constraint.ConstraintReferential.checkRowRefTable(ConstraintReferential.java:395)
>   at
> org.h2.constraint.ConstraintReferential.checkRow(ConstraintReferential.java:275)
>   at org.h2.table.Table.fireConstraints(Table.java:788)   at
> org.h2.table.Table.fireAfterRow(Table.java:805)   at
> org.h2.command.dml.Delete.update(Delete.java:79)  at
> org.h2.command.CommandContainer.update(CommandContainer.java:70)  at
> org.h2.command.Command.executeUpdate(Command.java:199)    at
> org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:141)
>   at
> org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:127)
>   at
> org.hibernate.engine.query.NativeSQLQueryPlan.performExecuteUpdate(NativeSQLQueryPlan.java:210)
>   ... 31 more

您能帮我确定为什么会发生这些错误吗?我尝试了所有我能想到的办法,但收效甚微。任何帮助将不胜感激。


您尝试在删除出勤之前从数据库中删除所有学生。但出勤率对学生来说有一把外键。因此,如果数据库允许您删除学生,您将得到一个不连贯的数据库:出勤引用不存在的学生。

因此,您必须先删除考勤,然后再删除学生。

请注意,实体之间存在的级联是无关紧要的,因为插入、更新和删除查询完全忽略它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JPA 参照完整性约束违规 oneToMany 和批量操作查询 的相关文章

  • 如何在 JSP 中导入类?

    我是一个完全的JSP初学者 我正在尝试使用java util List在 JSP 页面中 我需要做什么才能使用除以下类之外的类java lang 使用以下导入语句进行导入java util List 顺便说一句 要导入多个类 请使用以下格式
  • 无法在 Spring Boot 测试中模拟 persistenceContext

    我正在使用带有 Mockito 框架的 spring boot 测试来测试我的应用程序 存储库类 EntityManager 之一作为参考 我的班级如下所示 Repository Transactional Slf4j public cla
  • Firestore - RecycleView - 图像持有者

    我不知道如何编写图像的支架 我已经设置了 2 个文本 但我不知道图像的支架应该是什么样子 你能帮我告诉我图像的文字应该是什么样子才能正确显示吗 holder artistImage setImageResource model getArt
  • hive - 在值范围之间将一行拆分为多行

    我在下面有一张表 想按从开始列到结束列的范围拆分行 即 id 和 value 应该对开始和结束之间的每个值重复 包括两者 id value start end 1 5 1 4 2 8 5 9 所需输出 id value current
  • 如何让spring为JdbcMetadataStore创建相应的schema?

    我想使用此处描述的 jdbc 元数据存储 https docs spring io spring integration docs 5 2 0 BUILD SNAPSHOT reference html jdbc html jdbc met
  • 如何在android中设置多个闹钟,在这种情况下最后一个闹钟会覆盖以前的闹钟

    我正在开发一个Android应用程序 用户可以在其中设置提醒时间 但我在以下代码中遇到一个问题 即最后一个警报会覆盖之前的所有警报 MainActivity java public void setreminders DatabaseHan
  • JPA 中所有命名查询的列表

    我想获取应用程序中所有 NamedQueries 的列表 并且我还想在运行时一般调用它们 是否有一个选项可以获取列表以及某种元数据 一般来说是某种反射 另一个线程为 NHibernate 提供了某种解决方案 即使使用 Hibernate 作
  • Java:正则表达式排除空值

    在问题中here https stackoverflow com questions 51359056 java regexp for a separated group of digits 我得到了正则表达式来匹配 1 到 99 之间的一
  • 如何获取 WebElement 的父级[重复]

    这个问题在这里已经有答案了 我试过了 private WebElement getParent final WebElement webElement return webElement findElement By xpath 但我得到
  • 如何将 Jfreechart(饼图)添加到 netbeans 的面板中

    我正在使用 netbeans gui 编辑器 并且正在尝试添加一个本身位于内部框架中的 Jfreechart 并且这个内部框架我想将其添加到面板中 正如您在此图中看到的那样 抱歉 我无法直接发布图像 因为我新手 http www flick
  • 计算日期之间的天数差异

    在我的代码中 日期之间的差异是错误的 因为它应该是 38 天而不是 8 天 我该如何修复 package random04diferencadata import java text ParseException import java t
  • Oracle SQL PLS-00049:错误的绑定变量

    我收到此错误 这似乎是列拼写问题 然而 我 99 确信我拼写的所有内容都是正确的 但我看不出有任何理由会出现我所犯的错误 这是来源 CREATE OR REPLACE TRIGGER update qoh trigger AFTER INS
  • 重用 t-sql 游标的起始位置?

    我正在开发一个在临时表上使用游标的存储过程 我已经阅读了一些关于为什么不需要游标的内容 但在这种情况下我相信我仍然需要使用游标 在我的过程中 我需要遍历表的行两次 声明游标后 已经单步执行临时表并关闭游标 重新打开时游标的位置是否仍保留在表
  • Android Studio 将音乐文件读取为文本文件,如何恢复它?

    gameAlert mp3是我的声音文件 运行应用程序时 它询问我该文件不与任何文件类型关联 请定义关联 我选择TextFile错误地 现在我的音乐文件被读取为文本文件 我如何将其转换回music file protected void o
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 解析输入,除了 System.in.read() 之外不使用任何东西

    我很难找到具体的细节System in read 有效 也许有人可以帮助我 似乎扫描仪会更好 但我不允许使用它 我被分配了一个任务 我应该以 Boolean Operator Boolean 的形式读取控制台用户输入 例如T F 或 T T
  • 如何在 Quartz 调度程序中每 25 秒运行一次?

    我正在使用 Java 的 Quartz Scheduling API 你能帮我使用 cron 表达式每 25 秒运行一次吗 这只是一个延迟 它不必总是从第 0 秒开始 例如 序列如下 0 00 0 25 0 50 1 15 1 40 2 0
  • 挂钩 Eclipse 构建过程吗?

    我希望在 Eclipse 中按下构建按钮时能够运行一个简单的 Java 程序 目前 当我单击 构建 时 它会运行一些 JRebel 日志记录代码 我有一个程序可以解析 JRebel 日志文件并将统计信息存储在数据库中 是否可以编写一个插件或
  • 在android中跟踪FTP上传数据?

    我有一个运行 Android 的 FTP 系统 但我希望能够在上传时跟踪字节 这样我就可以在上传过程中更新进度条 安卓可以实现这个功能吗 现在 我正在使用org apache common net ftp我正在使用的代码如下 另外 我在 A
  • Android 和 Java 中绘制椭圆的区别

    在Java中由于某种原因Ellipse2D Double使用参数 height width x y 当我创建一个RectF在Android中参数是 left top right bottom 所以我对适应差异有点困惑 如果在 Java 中创

随机推荐

  • Joi 正则表达式不被识别为正则表达式模式

    我正在尝试为密码字段制定验证规则 它应包含以下内容 必须有号码 必须至少包含一个大写字母 必须包含至少一个小写字母 必须包含以下任何符号 长度应仅为 8 到 20 个字符 这是我使用的正则表达式模式 a z A Z d A Za z d 8
  • Django:尝试在 URL 中使用 Slug 时出现 404 错误

    我是 Django 的初学者 现在 我正在通过构建一个名为 PhoneReview 的应用程序来学习该框架 它将存储与最新手机相关的评论 它还将显示手机品牌 相关手机型号及其评论 现在 我正在尝试在 URL 中使用 slug 我已经在我的两
  • SQL Server中如何保持插入顺序

    我只是想知道我是否可以保持SQL Server中数据插入的顺序 我正在开发自己的项目 它是一种包含许多帖子的博客网站 我会将我的帖子保存到 SQL Server 但我希望它们按插入顺序排列 问 据我了解 如果我在SQL Server中使用自
  • 显示和隐藏窗口,而不是在可可应用程序中关闭单击时终止应用程序

    我一直在尝试在关闭 红色按钮 单击窗口时显示隐藏窗口 我想做的是隐藏窗口 当用户再次单击我的应用程序时 它将再次显示 预先感谢所有提供答案的开发人员 我是 Cocoa 应用程序的新手 我是iOS开发人员 所以我对cocoa应用程序了解不多
  • 商店中的成功和失败函数 - Ext JS

    我有一个请求 成功后会循环遍历 JSON 响应的每个属性并将其添加到我的store var request Ext Ajax request url MCApp jsonData searchquery params start 0 lim
  • Oracle 19c 安装错误:[INS-35179] 当前可用内存小于创建 DB 所需的可用内存 (1,597MB)

    我正在尝试安装 oracle 19c 在安装过程中遇到了与内存相关的问题 INS 35179 当前可用内存小于创建 DB 所需的可用内存 6 537MB 我仔细检查了所有先决条件 例如2GB free RAM 10 GB free spac
  • 水平调整 ImageView

    我正在开发一种电子书应用程序 并尝试通过以下两种方式显示图像 当屏幕处于portrait 我将图像水平放置并垂直居中 当屏幕处于landscape 我希望图像水平填充屏幕并保持纵横比 由于我使用的图像长于宽 所以我有一个ScrollView
  • React 和 Jest:无法从测试文件中找到模块

    为目录中的 Redux 操作 App js 设置 Jest 测试 App test js app tests 这是 App js 的标头 jest unmock modules actions App js import React fro
  • 如何将具有静态值的字段添加到mongodb查找查询?

    我们可以向 mongodb 添加一些具有静态值的自定义字段吗find query 我正在尝试将 API 请求 UId 添加 附加到我们对 mongodb 进行的所有查询 以便我们可以将请求与来自 mongodb 日志的慢速查询进行映射 我在
  • H2数据库TIMESTAMP列的默认值

    我正在用 H2 数据库编写集成测试 我的数据库 生成的 初始化包括此脚本 因为生成的联接表没有此列 ALTER TABLE INT USR ADD IU INSDTTM TIMESTAMP DEFAULT NOW 这就是我创建记录的方式 I
  • C++14 元编程:在编译/初始化时自动构建类型列表

    使用 C 14 和 Curiously Recurring Template Pattern CRTP 的某种组合以及可能的Boost Hana http www boost org doc libs 1 63 0 libs hana do
  • 将 x86 与 Blazor 结合使用时“无法启动调试适配器”

    我正在尝试使用 x86 中的 ASP NET 托管 只是基本模板应用程序 来调试 Blazor WebAssembly 应用程序 如果我使用 x64 平台进行调试 应用程序可以正常运行 但是 如果我将所有项目 服务器 客户端和共享 切换到
  • Tomcat 是否使用 pl/sql 模块的缓存版本?

    好吧 想象一下这种情况 我对 pl sql 模块进行了更改 重新编译它 一切都很好 没有错误 然后 我尝试访问在 Tomcat 上运行的应用程序上的 GUI 屏幕 该屏幕调用 oracle 数据库中的 pl sql 模块 当我提交应该调用
  • 您可以更改 logback 中 %caller{0} 的输出以模仿 log4j %l 说明符吗?

    我正在从 log4j 迁移到 Logback Log4j 具有 l 格式说明符 它将打印出调用方法的完全限定名称 后跟调用者在括号之间获取文件名和行号 示例 com my company MyClass doSomething MyClas
  • 在同一域上使用 firebase 函数的 oAuth 的跨域状态 cookie 问题

    我正在为 firebase 平台的用户实现 oAuth 登录 一切正常 除非用户has 禁用跨域 cookie 这就是我所做的 从我的域 应用程序 用户被重定向到云功能 can 函数设置statecookie 并将用户重定向到 oAuth
  • 在 R 中打印小于或等号?

    我尝试使用 u2264对于小于或等号 gt names table A1 lt c x P X x P X u2264x gt print table A1 但这出现在输出中 gt x P X x P X x gt 1 2 0 562 0
  • 在 JavaScript 中从字符串生成随机数

    我想制作一个客户端 A B 测试库 每个用户都有一个存储在 cookie 中的随机数 每个测试都有一个测试名称和一系列选项 我需要一个函数 根据用户的随机数 测试名称和选项来选择随机选项 当然 该函数必须始终为给定的一组输入返回相同的选项
  • iTunesConnect Testflight 没有适用于 iOS 的版本?

    我在向我的 iOS 版本之一添加管理员时遇到问题 当我点击我的构建时 它显示我有 2 个人可以测试它 但这不是我所期待的 我期待 3 个人 因为如果我单击 iTunesConnect 用户 我会看到 3 个人 但由于某种原因 我的朋友Yu
  • jQuery 中 HTML 表单标签的有效/无效名称是什么?

    这是我在这里遇到的错误的结果jQuery form serialize 仅返回序列化表单的一个元素 https stackoverflow com questions 1290011 jquery form serialize return
  • JPA 参照完整性约束违规 oneToMany 和批量操作查询

    My domain model diagram looks like this 正如您所看到的 我在学生和出勤之间以及出勤和研讨会之间有一个一对多的关系 下面是学生类和出勤类 以及我的帮助类 初始化程序 package com semina