首页 新闻 会员 周边

SSH整合,关联存储发生异常:a different object with the same identifier value was already associated

0
悬赏园豆:20 [已关闭问题] 关闭于 2012-04-13 08:57

      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的专业对象,可是还是这个异常。我各种手段都试了,我已经无计可施了。求大侠们多指导啊!!!小弟在此深鞠一躬!!

矢风快乐的主页 矢风快乐 | 初学一级 | 园豆:183
提问于:2012-04-12 09:01
< >
分享
所有回答(3)
0

表建主键了吗

玉开 | 园豆:8822 (大侠五级) | 2012-04-12 09:09

主键建了

支持(0) 反对(0) 矢风快乐 | 园豆:183 (初学一级) | 2012-04-12 09:14
0

主外键关系建立了么?

zhairui | 园豆:206 (菜鸟二级) | 2012-04-12 09:44

主外键建了!

支持(0) 反对(0) 矢风快乐 | 园豆:183 (初学一级) | 2012-04-12 09:59
0

 其实基本的错误我都没犯,就是丢掉了最核心的东西:面向对象。

我要取数据,根本不用去数据库取,一个teacher.getProfessions();就解决了!之前因为这个问题很后悔用级联,现在明白了其中原由,更喜欢用级联了。希望大家也能从中学点东东。Hibernate也是面向对象的。所以啊,不要只看java,要用Hibernate,你也要用面向对象的思想。

矢风快乐 | 园豆:183 (初学一级) | 2012-04-13 08:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册