JPA Нарушение ограничения ссылочной целостности oneToMany и запрос массовой манипуляции

Моя диаграмма модели домена выглядит следующим образом:

Как вы видите, у меня есть выпуск oneToMany между учеником и посещаемостью, а также между посещаемостью и семинаром.

Ниже приведены классы учащихся и участников, а также класс моего помощника (Initializer).

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 = new HashSet() ; 



    /**
     * 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 StudentAttendance*/

    /**
     * @return a new hashset contain 
     * 

all attendances of the student */ public HashSet getAttendance(){ return new HashSet(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 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 = new HashSet() ; 

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

    @OneToMany(mappedBy = "attendance",cascade=CascadeType.ALL)  
    private Set payment = new HashSet() ;/* 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

Не могли бы вы помочь мне определить причину этих ошибок? Я перепробовал все, что мог, но без особого успеха. Любая помощь будет принята с благодарностью.

Ответы на вопрос(1)

Ваш ответ на вопрос