首先你要有一个维护院系的功能吧,最简单的就是添加。
一个jsp,一个输入框,输入院系名,确定,
Department dept = new Department("来自输入框的院系名");
session.save(dept);现在来做你的添加学生的功能。
你的那个jsp,下拉的院系名称列表,选择选系名,输入学生名,确定,
Department existDept = deptDAO.findDeptById("来自jsp中下拉列表的院系id");
Student std = new Student("学生名");
std.setDepartment(existDept);
existDept.getStudents().add(std);//Department类中应该有一个students的集合,放学生用的
session.save(std);这样就保存了学生,而且不会新增院系,因为院系是通过deptDAO.findDeptById()从数据库中已有的数据查出来的。而你的程序已经写明了要new一个Department并保存,new一个学生并保存。建议你还是从数据库的基础操作入手,先学会用JDBC API如何正常的维护数据库,然后再来考虑使用Hibernate优化数据库的操作。

解决方案 »

  1.   

    你把属性department的cascade设成save-update了,所以会save其关联的dpartment.设为none或不指明即可。
    <many-to-one name="department" class="Department" cascade="none" />
      

  2.   

    错了就是  Saro(这也不是江水,这是二十年流不尽的英雄血。)  说的cascade="none" 要自动根据项目情况调节 cascade 万事有度,理解好了,自由设置
      

  3.   

    既然原系已经有了,你还new什么啊,
    Department dept=new Department("****");
    改成
    Department dept = (Department)session.get(Department.class,deptid);
      

  4.   

    还是有错误了:could not initialize a collection: 在添加学生时
    我在添加时没有用到SET
    添加学生
    public void addStudent(Student student,int deptId){
    try{
    session=HibernateSessionFactory.currentSession();
    tx=session.beginTransaction();
    Department dept=(Department)session.load(Department.class,new Integer(deptId));
    student.setStdDept(dept);
    dept.getStudents().add(student);
    session.save(student);
    tx.commit();
    }catch(HibernateException e)
    {
    throw e;
    }finally{
    if(tx!=null)
    tx.rollback();
    HibernateSessionFactory.closeSession();
    }

    }(双向一对多的关系)
    院系的配置文件
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- 
        Mapping file autogenerated by MyEclipse - Hibernate Tools
    -->
    <hibernate-mapping>
        <class name="com.project.hibernate.Department" table="department" catalog="project">
            <id name="id" type="integer">
                <column name="id" />
                <generator class="increment" />
            </id>
            <property name="deptName" type="string">
                <column name="dept_name" length="20" />
            </property>
            <set name="students"
              cascade="all-delete-orphan">
              <key column="id"/>
              <one-to-many class="com.project.hibernate.Student"/>
            </set>
        </class>
    </hibernate-mapping>学生
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- 
        Mapping file autogenerated by MyEclipse - Hibernate Tools
    -->
    <hibernate-mapping>
        <class name="com.project.hibernate.Student" table="student" catalog="project">
            <id name="stdId" type="string">
                <column name="std_id" length="8" />
                <generator class="assigned" />
            </id>
            <property name="stdName" type="string">
                <column name="std_name" length="20" />
            </property>
            <many-to-one name="stdDept"
              column="std_dept"
              class="com.project.hibernate.Department"
              cascade="save-update"
              not-null="false"
            />
        </class>
    </hibernate-mapping>这是什么问题?
      

  5.   

    由Student作主动端,在绝大多数情况下,都应该由many的一方作主动端:
     <set name="students"
              cascade="all-delete-orphan" inverse="true">
              <key column="std_dept"/>
              <one-to-many class="com.project.hibernate.Student"/>
            </set>save Student时,不需要级联save or update Department:
    <many-to-one name="stdDept"
              column="std_dept"
              class="com.project.hibernate.Department"
              not-null="false" />为了save一个student而把Department及其所有student都load出来显然是不合理的:
    session=HibernateSessionFactory.currentSession();
    tx=session.beginTransaction();
    Department dept=new Department();
    dept.setId(new Integer(deptId));
    student.setStdDept(dept);
    session.save(student);
    tx.commit();
      

  6.   

    非常感谢  
    Saro(这也不是江水,这是二十年流不尽的英雄)
    现在刚开始学习Hibernate,我把public void addStudent(Student student,int deptId)改成你上面所指导的,就没有错了
    还是不明白为什么会出现could not initialize a collection的错误???这还有一问题,是删除院系,(要同时删除其下的所有学生)级连删除
    删除时出现以下异常
    org.hibernate.exception.SQLGrammarException: could not initialize a collection:
    删除函数如下:
    public void removeDept(Integer deptID)
    {
    try{
    session=HibernateSessionFactory.currentSession();
    tx=session.beginTransaction();
    Department dept=(Department)session.load(Department.class,deptID);
    session.delete(dept);
    tx.commit();

    }catch(HibernateException e)
    {
    throw e;
    }finally{
    if(tx!=null)
    tx.rollback();
    HibernateSessionFactory.closeSession();
    }
    }
      

  7.   

    认真看了一下
    问题是出在
    Department dept=(Department)session.load(Department.class,new Integer(deptId));
    但不知该什么解决和原因?
      

  8.   

    没有设置order-by属性吧
    由Student作主动端,在绝大多数情况下,都应该由many的一方作主动端:
     <set name="students"
              cascade="all-delete-orphan" inverse="true" order-by="std_dept asc">
              <key column="std_dept"/>
              <one-to-many class="com.project.hibernate.Student"/>
            </set>
      

  9.   

    插入学生时此步也改下:
    public void addStudent(Student student,int deptId){
    try{
    session=HibernateSessionFactory.currentSession();
    tx=session.beginTransaction();
    Department dept=(Department)session.load(Department.class,new Integer(deptId));
    student.setStdDept(dept);
    dept.getStudents().add(student);
    session.save(dept);//应该保存dept
                               session.flush();
       tx.commit();
    }catch(HibernateException e)
    {
    throw e;
    }finally{
    if(tx!=null)
    tx.rollback();
    HibernateSessionFactory.closeSession();
    }

    }
      

  10.   

    <set name="students"
              cascade="all">
              <key column="id"/>
              <one-to-many class="com.project.hibernate.Student"/>
            </set>可以设置为all,你对院系的操作将级联学生
      

  11.   

    TO  killme2008(zane dennis)
    删除出现以下错误什么办??
    org.hibernate.exception.SQLGrammarException: could not initialize a collection:
      

  12.   

    你的Department有没有属性students??
    应该有这个属性:
    private Set students;
    public void setStudents(Set students){
    this.students=students;
    }
    public Set getStudents(){
    return this.students;
    }
    此set是java.util.Set
      

  13.   

    有  
    只要调用load函数
    Department dept=(Department)session.load(Department.class,new Integer(deptId));
    就会抛出异常
    org.hibernate.exception.SQLGrammarException: could not initialize a collection
      

  14.   

    恐怕还是配置问题吧,确认几点:  
    1.这里的key是你的student表中保存的关联department的外键
    <set name="students"
              cascade="all-delete-orphan">
              <key column="id"/>
              <one-to-many class="com.project.hibernate.Student"/>
            </set>
    2.student类中需要有department(对象)属性.