我有两个实体类,一个是dept是One的方,emp是Many的一方,在使用@OneToMany,@ManyToOne的双向关联时我想删除一的一方的时候发生了错误;首先我删除的是One的一方是级联了Many的一方的,发生了错误java.sql.BatchUpdateException: ORA-02292: 违反完整约束条件 (NHOSS.FK_EMP_DNO) - 已找到子记录    我是跟着教程配的,如果有看过马士兵老师的关于hibernate的视频的话,会很清楚的。我是跟着他的关于@OneToMany,@ManyToOne的双向关联crud那个视频配置的,他使用的纯hibernate,我使用的是ssh,删除是用hibernateTemplate的delete方法删除的,由于我怀疑是否是是自己的配置不正确,所以我就将老师的实体类也改了和我的类是,结构他的程序依然正常使用,
马士兵老师的删除的语句

public void testDeleteGroup() {
Session s = sessionFactory.getCurrentSession();
s.beginTransaction();
Group g = (Group)s.get(Group.class, 1);
s.delete(g);
s.getTransaction().commit();
}
以下是我的删除语句dept.setDno(id);//注:这里的set在我的程序是没有的,我是通过spring注入ID进去的
hibernateTemplate.delete(dept);
 

解决方案 »

  1.   

    修改后马老师的代码
    Group.java
    @Entity
    @Table(name="t_group")
    public class Group {

    private int gid;
    private String gname;
    private Set<User> users = new HashSet<User>(); @Id
    public int getGid() {
    return gid;
    }
    public void setGid(int gid) {
    this.gid = gid;
    }
    public String getGname() {
    return gname;
    }
    public void setGname(String gname) {
    this.gname = gname;
    }
    @OneToMany(mappedBy="group",cascade={CascadeType.ALL})
    public Set<User> getUsers() {
    return users;
    }
    public void setUsers(Set<User> users) {
    this.users = users;
    }
    User.java
    @Entity
    @Table(name="t_user")
    public class User {
    private int uid;
    private String uname;
    private Group group;

    @Id
    public int getUid() {
    return uid;
    }
    public void setUid(int uid) {
    this.uid = uid;
    }
    public String getUname() {
    return uname;
    }
    public void setUname(String uname) {
    this.uname = uname;
    }
    @ManyToOne(cascade={CascadeType.ALL})
    @JoinColumn(name="gid")
    public Group getGroup() {
    return group;
    }
    public void setGroup(Group group) {
    this.group = group;
    }
      

  2.   

    我的程序实体类代码
     Dept .java@Entity
    public class Dept { // Fields private String dno;
    private String dname;
    private String loc;
    private Set<Emp> emps = new HashSet<Emp>();

    @Id
    public String getDno() {
    return this.dno;
    } public void setDno(String dno) {
    this.dno = dno;
    } public String getDname() {
    return this.dname;
    } public void setDname(String dname) {
    this.dname = dname;
    } public String getLoc() {
    return this.loc;
    } public void setLoc(String loc) {
    this.loc = loc;
    }
    @OneToMany(mappedBy="dept",cascade={CascadeType.ALL})
    public Set<Emp> getEmps() {
    return emps;
    } public void setEmps(Set<Emp> emps) {
    this.emps = emps;
    }
    }code]
    Emp .java
    [code=Java]@Entity
    public class Emp { // Fields private String empno;
    private Dept dept;
    private String ename;
    private String epwd;
    private String title;
    private String sex;

    private Date hiredate;
    private double sal;
    @Id
    public String getEmpno() {
    return this.empno;
    } public void setEmpno(String empno) {
    this.empno = empno;
    }
    @ManyToOne(cascade={CascadeType.ALL})
    @JoinColumn(name="dno")
    public Dept getDept() {
    return this.dept;
    } public void setDept(Dept dept) {
    this.dept = dept;
    } public String getEname() {
    return this.ename;
    } public void setEname(String ename) {
    this.ename = ename;
    } public String getEpwd() {
    return this.epwd;
    } public void setEpwd(String epwd) {
    this.epwd = epwd;
    } public String getTitle() {
    return this.title;
    } public void setTitle(String title) {
    this.title = title;
    } public String getSex() {
    return this.sex;
    } public void setSex(String sex) {
    this.sex = sex;
    } public Date getHiredate() {
    return this.hiredate;
    } public void setHiredate(Date hiredate) {
    this.hiredate = hiredate;
    } public double getSal() {
    return this.sal;
    } public void setSal(double sal) {
    this.sal = sal;
    }
    }
      

  3.   

    我的代码都和马老师的差不多啊,怎么他的在删除One的一方会产生级联,而我的在删除One的一方不会产生级联呢