我做了一个教师与学生的一对多的双向关联关系,在对教师进行删除发现hibernate对学生表是一条一条的删,这样太慢了,能不能批量删除。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping>
<class name="com.qh.domain.Student" table="student" schema="dbo">
<id name="id" type="java.lang.Integer">
<column name="id"/>
<generator class="identity"/>
</id>
<property name="studentName" type="java.lang.String">
<column name="studentName"/>
</property>
<many-to-one name="teacher" column="teacher_id" class="com.qh.domain.Teacher"/>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping>
<class name="com.qh.domain.Teacher" table="teacher" schema="dbo">
<id name="id" type="java.lang.Integer">
<column name="id"/>
<generator class="identity"/>
</id>
<property name="teacherName" type="java.lang.String">
<column name="teacherName"/>
</property>
<set name="students" inverse="true" fetch="select" cascade="delete" lazy="false">
<key column="teacher_id"/>
<one-to-many class="com.qh.domain.Student"/>
</set>
</class>
</hibernate-mapping>Session session = HibernateSessionFactory.getSession();
Transaction tx = session.beginTransaction();

Teacher t = (Teacher) session.get(Teacher.class, new Integer(10));
if(t==null){
System.out.println("不存在该教师");
} else {
session.delete(t);
}
tx.commit();

HibernateSessionFactory.closeSession();生成的sql语句如下:
Hibernate: 
    select
        teacher0_.id as id1_0_,
        teacher0_.teacherName as teacherN2_1_0_ 
    from
        dbo.teacher teacher0_ 
    where
        teacher0_.id=?
Hibernate: 
    select
        students0_.teacher_id as teacher3_1_,
        students0_.id as id1_,
        students0_.id as id0_0_,
        students0_.studentName as studentN2_0_0_,
        students0_.teacher_id as teacher3_0_0_ 
    from
        dbo.student students0_ 
    where
        students0_.teacher_id=?
Hibernate: 
    delete 
    from
        dbo.student 
    where
        id=?
Hibernate: 
    delete 
    from
        dbo.student 
    where
        id=?
Hibernate: 
    delete 
    from
        dbo.student 
    where
        id=?
Hibernate: 
    delete 
    from
        dbo.teacher 
    where
        id=?这是在后面的删除学生表时hibernate能不能直接delete from student where teacher_id=?这样呢

解决方案 »

  1.   


        public int deleteBrands(Long[] delBrandId){
            Session session = getSession();
             Transaction tx = session.beginTransaction();
            StringBuffer sql = new StringBuffer();
            sql.append("delete Brand  where brandId  in ( :brandId) ");
            Query query = session.createQuery(sql.toString());
            query.setParameterList("brandId",delBrandId);
            int dels = query.executeUpdate();
            tx.commit();
            return dels;
        }可以这样。但是直接通过Hibernate进行批量更新和批量删除都不值得推荐,
    因为hibernate在批量更新和删除上没有什么优势
      

  2.   

    不对吧,老师删除了,学生为什么要删除啊?还有,如果是对照表,你可以让数据库做级联删除就好了 cascade delete