2015-06-29 150 views
0

嗨,我已經停留在hibernate與Spring MVC的關係中,我有類Student,並且此類與Parent類具有OneToOne關係,我的錯誤是當我試圖刪除Student對象時,父類對象不允許刪除Student對象 這是給這樣的錯誤Spring和Hibernate MVC

Hibernate: delete from Student where id=? 
WARN : org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 1451, SQLState: 23000 
ERROR: org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Cannot delete or update a parent row: a foreign key constraint fails (`digischool`.`parent`, CONSTRAINT `FK_l65r4icaxmteeq1tg96t6n3ol` FOREIGN KEY (`student_id`) REFERENCES `student` (`id`)) 
" 

我有學生模型類像

@Entity 
public class Student implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    private long id; 
    private String name; 
    private Parent parent; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    public long getId() { 
     return id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 


    @OneToOne(mappedBy="student",fetch=FetchType.EAGER) 
    public Parent getParent() { 
     return parent; 
    } 
    public void setParent(Parent parent) { 
     this.parent = parent; 
    } 

} 

父模型類像

public boolean deleteStudent(long studentId) { 
     if(studentId > 0){ 
      Session session = getSessionFactory().getCurrentSession(); 
      Query query = session.createQuery("DELETE FROM Student S WHERE S.id = :studentId"); 
      query.setParameter("studentId", studentId); 
      int rowChanged = query.executeUpdate(); 
      if(rowChanged > 0){ 
       return true; 
      } 
     } 
     return false; 
    } 

我的數據庫是

@Entity 
public class Parent { 

    private long id; 
    private String name; 
    private String phoneNumber; 
    private String email; 
    private String relation; 
    private Student student; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    public long getId() { 
     return id; 
    } 
    public void setId(long id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 

    public String getPhoneNumber() { 
     return phoneNumber; 
    } 
    public void setPhoneNumber(String phoneNumber) { 
     this.phoneNumber = phoneNumber; 
    } 

    @OneToOne(fetch=FetchType.EAGER) 
    @JoinColumn(name="student_id") 
    public Student getStudent() { 
     return student; 
    } 
    public void setStudent(Student student) { 
     this.student = student; 
    } 

    public String getRelation() { 
     return relation; 
    } 
    public void setRelation(String relation) { 
     this.relation = relation; 
    } 

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

爲了刪除Student對象我寫DAO看起來像Student Db

Parent Db

請幫我我是新蜂今年春季世界

回答

0

這是因爲您在刪除之前僞造刪除父實體的關係學生。

的方式做到這一點:

public boolean deleteStudent(long studentId) { 
    if(studentId > 0){ 
// get parent object 
parent.setStudent(null); // THIS REMOVES THE RELATIONSHIP FROM PARENT CLASS SINCE ITS STORED THERE 
// save parent object with emptied student field 


     Session session = getSessionFactory().getCurrentSession(); 
     Query query = session.createQuery("DELETE FROM Student S WHERE S.id = :studentId"); 
     query.setParameter("studentId", studentId); 
     int rowChanged = query.executeUpdate(); 
     if(rowChanged > 0){ 
      return true; 
     } 
    } 
    return false; 
} 

FYI 時,你可以使用Hibernate的自己的功能。 看看這個鏈接一些方法來刪除對象http://www.codejava.net/frameworks/hibernate/hibernate-basics-3-ways-to-delete-an-entity-from-the-datastore

+0

嘿@Aeseir爲什麼要手動設置父對象爲null,我提到級聯類型上的Student Model Class知道必須小心刪除子對象對嗎? – Darshan

0

你可以用註釋@OneToOne使用屬性orphanRemoval = trueParent實體

@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true) 
public Student getStudent() { 
    return student; 
} 

.... 

希望它能幫助。