首先你要有一个维护院系的功能吧,最简单的就是添加。
一个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优化数据库的操作。
一个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优化数据库的操作。
解决方案 »
- 关于在Action里导出Excel
- Spring配置文件
- jsp中使用ckeditor的相关问题
- java 导出zip文件夹并实现可选路径
- 空闲时间做的一个网站,可以查薪水、面经、公司评论等,求大家的指点和拍砖
- jsf中访问后缀的问题
- A页弹出B页 B页做相应的设置,然后关闭,提交的action,A页重载或刷新去更新过的list,问题是B页关闭后有时不提交!!
- 伤心了,难道中国的软件开发就只能用原型法吗?
- 急用,兄弟姐妹们来扶我一把,谢了!!全不分了
- 如何取得JSP页面session值
- 初学者的一个hibernate 查询问题
- strut, spring, hibernate 为什么叫J2EE FRAMEWORKS
<many-to-one name="department" class="Department" cascade="none" />
Department dept=new Department("****");
改成
Department dept = (Department)session.get(Department.class,deptid);
我在添加时没有用到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>这是什么问题?
<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();
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();
}
}
问题是出在
Department dept=(Department)session.load(Department.class,new Integer(deptId));
但不知该什么解决和原因?
由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>
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();
}
}
cascade="all">
<key column="id"/>
<one-to-many class="com.project.hibernate.Student"/>
</set>可以设置为all,你对院系的操作将级联学生
删除出现以下错误什么办??
org.hibernate.exception.SQLGrammarException: could not initialize a collection:
应该有这个属性:
private Set students;
public void setStudents(Set students){
this.students=students;
}
public Set getStudents(){
return this.students;
}
此set是java.util.Set
只要调用load函数
Department dept=(Department)session.load(Department.class,new Integer(deptId));
就会抛出异常
org.hibernate.exception.SQLGrammarException: could not initialize a collection
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(对象)属性.