2013-11-29 33 views
3

我的域模型圖如下所示: Domain Model AbstractJPA引用完整性約束違規一對多和批量操作查詢

正如你可以看到我有學生和考勤之間和考勤和研討會之間的一對多releation。

下面是學生和考勤班,以及我的助手班(初始化者)。

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]","antoniou","password","998456"); 
     s1.setStudentId(1); 
     Student s2=new Student("ilias","butsikakis","[email protected]","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]","antoniou","password","998456"); 
     s1.setStudentId(1); 
     Student s2=new Student("ilias","butsikakis","[email protected]","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]ail.com","antoniou","password","998456"); 
     s1.setStudentId(1); 
     Student s2=new Student("ilias","butsikakis","[email protected]","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測試檢查,因此在初始化器類,我們有這產生了一些樣本數據使用PrepareData方法在每次檢查中還有一個刪除方法,以確保每次檢查都使用相同的數據完成。

在試圖檢查Student和Attendance之間的連接之前,一切似乎都正常。我在初始化器中創建了一個新的考勤對象,以測試學生是否可以在研討會中註冊「好」,並且我收到了很多異常消息。

我注意到大多數雖然(它顯示在控制檯)的一個是

3781 [主]錯誤org.hibernate.util.JDBCExceptionReporter - 參照完整性約束衝突:「FKE7E9BF09F9FEB38B :「 PUBLIC」。「」出勤「」外國關鍵(學生)參考 PUBLIC。「」學生「」(「」studentId「」)「; SQL語句:從 「學生」 [23003-135]

我檢查,以確保註釋和瀑布是在正確的地方,但沒有結果刪除...

我也試過改變順序的項目都保存在initilizer類,但隨後其他錯誤出現

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

你能幫我確定爲什麼會發生這些錯誤嗎?我嘗試了所有我能想到的,但很少成功的東西。任何幫助將不勝感激。

回答

5

您正試圖在刪除出席者之前從數據庫中刪除所有學生。但出席對學生有一個外鍵。因此,如果數據庫允許您刪除學生,那麼您將擁有一個不連貫的數據庫:引用不存在的學生的出勤率。

因此,您必須在刪除學生之前刪除出席者。

請注意,實體之間存在的級聯無關緊要,因爲插入,更新和刪除查詢完全忽略它們。

+0

通過在學生之前添加考勤刪除,它可以工作。 現在我有另一個小問題。當我嘗試測試出席的學生的刪除時,我得到「Entitynotfound異常:傳遞給堅持的實體」。 我修改了關係如下: 在學生: @OneToMany(orphanRemoval =假,級聯= CascadeType.ALL,的mappedBy = 「學生」) 和考勤 @ManyToOne(級聯= {CascadeType.PERSIST,CascadeType.MERGE })\t \t @JoinColumn(name =「studentId」,nullable = false) \t私立學​​生學生; 你能幫我解決這個問題嗎? – George

相關問題