有个用户选课的小项目,我想删除实现用户删除某个课程的选择,我是这样实现的,但总是不成功,也不报错,高手给指点一下:
1、我的user 的xml配置文件部分代码
<set name="courseSet" table="student_course"
cascade="save-update"  lazy="false">
<key column="stu_id"></key> <many-to-many class="com.test.bean.Course" column="course_id" not-found="ignore"></many-to-many>
</set>
2、课程表的配置文件
<set name="userSet" table="student_course"
cascade="save-update" lazy="false"  inverse="true">
<key column="course_id" />
<many-to-many class="com.test.bean.User"
column="stu_id" not-found="ignore"/>
</set>
3、删除中间表的代码: Course course = this.courseDao.findCourseById(id);// 通过id获得course Map sessionMap = ActionContext.getContext().getSession(); User user = this.userService.findUserById((Integer) sessionMap
.get("userid"));// 通过放在session中的userid获取user
user.getCourseSet().remove(course); course.getUserSet().remove(user); this.userService.saveOrUpdate(user);

解决方案 »

  1.   

    呵呵 我也不用hibernate 帮你顶一下吧
      

  2.   

    这个例子我好像在 夏昕的 “深入浅出Hibernate” 中讲过,还讲过如何处理,时间过的太久了,我也很少用这样多对多,所以,忘了。楼主去看下这本书。或者Google下,hibernate多对多操作。
      

  3.   

    你应该是想删除对应用户中的其中一门课程吧
    DAO层
    this.getHibernateTemplate().delete("from User u,Course c where u.uerid=c.courseid");
    试试
      

  4.   

    大概应该和 inverse 属性有关。只能帮你这么多了。等做过的人回答,学习,up
      

  5.   

    看错了
    应该是
    this.getHibernateTemplate().delete("from User u where u.uerid=user.id and Course.courseid=courseid"); 
    在course那边inverse="true" 试试呢 
      

  6.   

    请问楼上 写得 Course.courseid,这里的Course是指的类名还是? 这样写可以么
      

  7.   

    试了试 this.getHibernateTemplate().delete("from User u ,Course c where u.id=userid and c.courseid=courseid"); 抛出错误异常
    .MappingException: Unknown entity: java.lang.String
    org.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:550)
    org.hibernate.impl.SessionImpl.getEntityPersister(SessionImpl.java:1338)
    org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:78)
    org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:52)
    org.hibernate.impl.SessionImpl.fireDelete(SessionImpl.java:766)
    org.hibernate.impl.SessionImpl.delete(SessionImpl.java:744)
    org.springframework.orm.hibernate3.HibernateTemplate$25.doInHibernate(HibernateTemplate
      

  8.   

    学生配置这端添加 inverse="false" 看看。
      

  9.   

    user.getCourseSet().remove(course); 
    是以学生作为主控 remove掉 course后 hibernate就会自动删除相关中间表数据,不需要执行
    this.userService.saveOrUpdate(user); 
    你下面有运行了一句
    course.getUserSet().remove(user); 
    如果这句想达到实现删除中间表的目的就需要把 course 也设为主控方。以达到学生和课程都能维护中间表的目的。
      

  10.   


    User user = this.userService.findUserById((Integer) sessionMap 
    .get("userid")); 
     Set<Course> cs = user.getCourses();   
        for (Course c : cs) {   
            c.getUsers().remove(user);   
        }   
        session.delete(user);   
        session.getTransaction().commit();   
        session.close();   
      

  11.   

    hibernate不提倡用多对多的
    加个中间关系表,分成一对多和多对一的关系。然后就简单了 
    中间表大概是这样:
    ID   UserId    CourseId.
    分别是2个表的外键
      

  12.   

    删除的时候 写SQL语句两条 
    先删除表中的记录 如果删除成功 
    在删除 中间表中的记录
      

  13.   

    不可能吧 你看下hibernate自动生成的语句。贴出来看下。可能是其他原因导致的。
      

  14.   

    这是显示的单个用户选择的所有课程的sql代码
    Hibernate: select user0_.id as id0_0_, user0_.firstname as firstname0_0_, user0_.lastname as lastname0_0_, user0_.age as age0_0_ from users user0_ where user0_.id=?
    Hibernate: select courseset0_.stu_id as stu1_1_, courseset0_.course_id as course2_1_, course1_.id as id4_0_, course1_.name as name4_0_ from student_course courseset0_ left outer join course course1_ on courseset0_.course_id=course1_.id where courseset0_.stu_id=?
    Hibernate: select userset0_.course_id as course2_1_, userset0_.stu_id as stu1_1_, user1_.id as id0_0_, user1_.firstname as firstname0_0_, user1_.lastname as lastname0_0_, user1_.age as age0_0_ from student_course userset0_ left outer join users user1_ on userset0_.stu_id=user1_.id where userset0_.course_id=?
    Hibernate: select user0_.id as id0_0_, user0_.firstname as firstname0_0_, user0_.lastname as lastname0_0_, user0_.age as age0_0_ from users user0_ where user0_.id=?
    Hibernate: select userset0_.course_id as course2_1_, userset0_.stu_id as stu1_1_, user1_.id as id0_0_, user1_.firstname as firstname0_0_, user1_.lastname as lastname0_0_, user1_.age as age0_0_ from student_course userset0_ left outer join users user1_ on userset0_.stu_id=user1_.id where userset0_.course_id=?
    Hibernate: select userset0_.course_id as course2_1_, userset0_.stu_id as stu1_1_, user1_.id as id0_0_, user1_.firstname as firstname0_0_, user1_.lastname as lastname0_0_, user1_.age as age0_0_ from student_course userset0_ left outer join users user1_ on userset0_.stu_id=user1_.id where userset0_.course_id=?
    Hibernate: select userset0_.course_id as course2_1_, userset0_.stu_id as stu1_1_, user1_.id as id0_0_, user1_.firstname as firstname0_0_, user1_.lastname as lastname0_0_, user1_.age as age0_0_ from student_course userset0_ left outer join users user1_ on userset0_.stu_id=user1_.id where userset0_.course_id=?
    Hibernate: select user0_.id as id0_0_, user0_.firstname as firstname0_0_, user0_.lastname as lastname0_0_, user0_.age as age0_0_ from users user0_ where user0_.id=?
    Hibernate: select user0_.id as id0_0_, user0_.firstname as firstname0_0_, user0_.lastname as lastname0_0_, user0_.age as age0_0_ from users user0_ where user0_.id=?
    2\这是点击删除某门课程后的sql代码,如果不加this.userService.saveOrUpdate(user); 中间的updae语句就没有 剩下的都是select语句,根本就没有删除的语句
    Hibernate: select user0_.id as id0_0_, user0_.firstname as firstname0_0_, user0_.lastname as lastname0_0_, user0_.age as age0_0_ from users user0_ where user0_.id=?
    Hibernate: select courseset0_.stu_id as stu1_1_, courseset0_.course_id as course2_1_, course1_.id as id4_0_, course1_.name as name4_0_ from student_course courseset0_ left outer join course course1_ on courseset0_.course_id=course1_.id where courseset0_.stu_id=?
    Hibernate: select userset0_.course_id as course2_1_, userset0_.stu_id as stu1_1_, user1_.id as id0_0_, user1_.firstname as firstname0_0_, user1_.lastname as lastname0_0_, user1_.age as age0_0_ from student_course userset0_ left outer join users user1_ on userset0_.stu_id=user1_.id where userset0_.course_id=?
    Hibernate: select user0_.id as id0_0_, user0_.firstname as firstname0_0_, user0_.lastname as lastname0_0_, user0_.age as age0_0_ from users user0_ where user0_.id=?
    Hibernate: select userset0_.course_id as course2_1_, userset0_.stu_id as stu1_1_, user1_.id as id0_0_, user1_.firstname as firstname0_0_, user1_.lastname as lastname0_0_, user1_.age as age0_0_ from student_course userset0_ left outer join users user1_ on userset0_.stu_id=user1_.id where userset0_.course_id=?
    Hibernate: select userset0_.course_id as course2_1_, userset0_.stu_id as stu1_1_, user1_.id as id0_0_, user1_.firstname as firstname0_0_, user1_.lastname as lastname0_0_, user1_.age as age0_0_ from student_course userset0_ left outer join users user1_ on userset0_.stu_id=user1_.id where userset0_.course_id=?
    Hibernate: select userset0_.course_id as course2_1_, userset0_.stu_id as stu1_1_, user1_.id as id0_0_, user1_.firstname as firstname0_0_, user1_.lastname as lastname0_0_, user1_.age as age0_0_ from student_course userset0_ left outer join users user1_ on userset0_.stu_id=user1_.id where userset0_.course_id=?
    Hibernate: select user0_.id as id0_0_, user0_.firstname as firstname0_0_, user0_.lastname as lastname0_0_, user0_.age as age0_0_ from users user0_ where user0_.id=?
    Hibernate: select user0_.id as id0_0_, user0_.firstname as firstname0_0_, user0_.lastname as lastname0_0_, user0_.age as age0_0_ from users user0_ where user0_.id=?
    Hibernate: select course0_.id as id4_0_, course0_.name as name4_0_ from course course0_ where course0_.id=?
    Hibernate: select userset0_.course_id as course2_1_, userset0_.stu_id as stu1_1_, user1_.id as id0_0_, user1_.firstname as firstname0_0_, user1_.lastname as lastname0_0_, user1_.age as age0_0_ from student_course userset0_ left outer join users user1_ on userset0_.stu_id=user1_.id where userset0_.course_id=?
    Hibernate: select courseset0_.stu_id as stu1_1_, courseset0_.course_id as course2_1_, course1_.id as id4_0_, course1_.name as name4_0_ from student_course courseset0_ left outer join course course1_ on courseset0_.course_id=course1_.id where courseset0_.stu_id=?
    Hibernate: select userset0_.course_id as course2_1_, userset0_.stu_id as stu1_1_, user1_.id as id0_0_, user1_.firstname as firstname0_0_, user1_.lastname as lastname0_0_, user1_.age as age0_0_ from student_course userset0_ left outer join users user1_ on userset0_.stu_id=user1_.id where userset0_.course_id=?
    Hibernate: select user0_.id as id0_0_, user0_.firstname as firstname0_0_, user0_.lastname as lastname0_0_, user0_.age as age0_0_ from users user0_ where user0_.id=?
    Hibernate: select userset0_.course_id as course2_1_, userset0_.stu_id as stu1_1_, user1_.id as id0_0_, user1_.firstname as firstname0_0_, user1_.lastname as lastname0_0_, user1_.age as age0_0_ from student_course userset0_ left outer join users user1_ on userset0_.stu_id=user1_.id where userset0_.course_id=?
    Hibernate: select userset0_.course_id as course2_1_, userset0_.stu_id as stu1_1_, user1_.id as id0_0_, user1_.firstname as firstname0_0_, user1_.lastname as lastname0_0_, user1_.age as age0_0_ from student_course userset0_ left outer join users user1_ on userset0_.stu_id=user1_.id where userset0_.course_id=?
    Hibernate: select user0_.id as id0_0_, user0_.firstname as firstname0_0_, user0_.lastname as lastname0_0_, user0_.age as age0_0_ from users user0_ where user0_.id=?
    Hibernate: select user0_.id as id0_0_, user0_.firstname as firstname0_0_, user0_.lastname as lastname0_0_, user0_.age as age0_0_ from users user0_ where user0_.id=?
    Hibernate: select course_.id, course_.name as name4_ from course course_ where course_.id=?
    Hibernate: select course_.id, course_.name as name4_ from course course_ where course_.id=?
    Hibernate: select course_.id, course_.name as name4_ from course course_ where course_.id=?
    Hibernate: select course_.id, course_.name as name4_ from course course_ where course_.id=?
    Hibernate: update users set firstname=?, lastname=?, age=? where id=?
    Hibernate: select user0_.id as id0_0_, user0_.firstname as firstname0_0_, user0_.lastname as lastname0_0_, user0_.age as age0_0_ from users user0_ where user0_.id=?
    Hibernate: select courseset0_.stu_id as stu1_1_, courseset0_.course_id as course2_1_, course1_.id as id4_0_, course1_.name as name4_0_ from student_course courseset0_ left outer join course course1_ on courseset0_.course_id=course1_.id where courseset0_.stu_id=?
    Hibernate: select userset0_.course_id as course2_1_, userset0_.stu_id as stu1_1_, user1_.id as id0_0_, user1_.firstname as firstname0_0_, user1_.lastname as lastname0_0_, user1_.age as age0_0_ from student_course userset0_ left outer join users user1_ on userset0_.stu_id=user1_.id where userset0_.course_id=?
    Hibernate: select user0_.id as id0_0_, user0_.firstname as firstname0_0_, user0_.lastname as lastname0_0_, user0_.age as age0_0_ from users user0_ where user0_.id=?
    Hibernate: select userset0_.course_id as course2_1_, userset0_.stu_id as stu1_1_, user1_.id as id0_0_, user1_.firstname as firstname0_0_, user1_.lastname as lastname0_0_, user1_.age as age0_0_ from student_course userset0_ left outer join users user1_ on userset0_.stu_id=user1_.id where userset0_.course_id=?
    Hibernate: select userset0_.course_id as course2_1_, userset0_.stu_id as stu1_1_, user1_.id as id0_0_, user1_.firstname as firstname0_0_, user1_.lastname as lastname0_0_, user1_.age as age0_0_ from student_course userset0_ left outer join users user1_ on userset0_.stu_id=user1_.id where userset0_.course_id=?
    Hibernate: select userset0_.course_id as course2_1_, userset0_.stu_id as stu1_1_, user1_.id as id0_0_, user1_.firstname as firstname0_0_, user1_.lastname as lastname0_0_, user1_.age as age0_0_ from student_course userset0_ left outer join users user1_ on userset0_.stu_id=user1_.id where userset0_.course_id=?
    Hibernate: select user0_.id as id0_0_, user0_.firstname as firstname0_0_, user0_.lastname as lastname0_0_, user0_.age as age0_0_ from users user0_ where user0_.id=?
    Hibernate: select user0_.id as id0_0_, user0_.firstname as firstname0_0_, user0_.lastname as lastname0_0_, user0_.age as age0_0_ from users user0_ where user0_.id=?
      

  15.   

    我现在还不会用什么端点调试,我今天用if语句输出了一下 ,发现课程的用户集合里面没有相应的用户,返回的是FALSE,可是数据库有相应的记录啊,这是为什么?
    Map sessionMap = ActionContext.getContext().getSession(); User user = this.userService.findUserById((Integer) sessionMap
    .get("userid"));
    Course course = this.courseService.findCourseById(id);
    if (user == null)
    {
    System.out.println("user null");
    }

    if (course == null)
    {
    System.out.println("course null");
    }
    if (course.getUserSet().contains(user))
    {
    System.out.println("true");
    course.getUserSet().remove(user);
    }
    else
    {
    System.out.println("false");
    }