2015-06-29 152 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; 
} 

.... 

希望它能帮助。