a different object with the same identifier value was already associated with the session;
我的问题的起因:
现在有2个实体类:专业,班级;关联关系是:1:n;现在已经有多个专业了,要向专业添加班级,但是,页面上我有个选择列表,因此,把所有的专业放在一个集合中存在会话session中,然后在页面里显示专业名称,用于选择添加班级的专业;可是,当完成了添加班级表单的操作,提交表单后,要实现逻辑:把这个班级级联专业存放到数据库,其中要设置其关联专业:下面是Action逻辑代码:
1 ClaSS c = new ClaSS(); 2 Profession p = tsvc.findProfessionById(Integer.parseInt(prfID)); 3 Teacher t = (Teacher)ActionContext.getContext().getSession().get("utea"); 4 //2.根据信息新建班级: 5 c.setName(name); 6 c.setGrade(Integer.parseInt(grade)); 7 c.setTeacher(t); 8 if(tsvc.saveCls(c)){ 9 return "tlist"; 10 } 11 return "fail";
下面是Service层代码:
public boolean saveCls(ClaSS c) { cdao.saveClaSS(c); return true; }
下面是DAO层代码:
public void saveClaSS(ClaSS c) { this.getHibernateTemplate().save(c); }
下面把配置也粘出来吧:class.hbm.xml:
<?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="org.smis.bean.ClaSS" table="class"> <id name="id" type="java.lang.Integer" column="id"> <generator class="increment"></generator> </id> <property name="name" type="string" column="name" length="20"></property> <property name="grade" type="int" column="grade"></property> <set name="students" cascade="all" inverse="true" lazy="false"> <key column="c_id" /> <one-to-many class="org.smis.bean.Student" /> </set> <many-to-one name="teacher" class="org.smis.bean.Teacher" column="t_id" cascade="save-update" lazy="false"/> <many-to-one name="profession" class="org.smis.bean.Profession" column="p_id" cascade="save-update" lazy="false"/> </class> </hibernate-mapping>
然后是profession.hbm.xml:
<?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="org.smis.bean.Profession" table="profession"> <id name="id" type="java.lang.Integer" column="id"> <generator class="increment"></generator> </id> <property name="name" type="string" column="name" length="20"></property> <property name="degree" type="string" column="degree" length="15"> </property> <property name="stu_sys" type="int" column="stu_sys"></property> <set name="claSSes" cascade="all" inverse="true" lazy="false"> <key column="p_id" /> <one-to-many class="org.smis.bean.ClaSS" /> </set> <many-to-one name="teacher" class="org.smis.bean.Teacher" column="t_id" cascade="save-update" lazy="false"/> <many-to-one name="dept" class="org.smis.bean.Dept" column="d_id" cascade="save-update" lazy="false"/> </class> </hibernate-mapping>
然后是异常信息:a different object with the same identifier value was already associated;然后就是说:重复对象的类是我的专业类:#[org.smis.bean.Profession];
在线等,求救啊!!
网上好多都说是要用session的merge()合并这2个对象,我做了,不行;还有的说refresh(),我也做了,也不行。我也曾尝试直接引用回话session的专业对象,可是还是这个异常。我各种手段都试了,我已经无计可施了。求大侠们多指导啊!!!小弟在此深鞠一躬!!
表建主键了吗
主键建了
主外键关系建立了么?
主外键建了!
其实基本的错误我都没犯,就是丢掉了最核心的东西:面向对象。
我要取数据,根本不用去数据库取,一个teacher.getProfessions();就解决了!之前因为这个问题很后悔用级联,现在明白了其中原由,更喜欢用级联了。希望大家也能从中学点东东。Hibernate也是面向对象的。所以啊,不要只看java,要用Hibernate,你也要用面向对象的思想。