|
锁定老贴子 主题:many to many 的关系如何保存?
该帖已经被评为精华帖
|
|
|---|---|
| 作者 | 正文 |
|
时间:2003-09-16
配置了many to many关系,
数据读取,建表都没有问题 [code:1]<bag name="popedoms" lazy="true" table="EXM_ROLE_POPEDOM" cascade="all" inverse="true"> <key> <column name="ROLE_ID" sql-type="INT(10)"/> </key> <many-to-many class="eg.PopedomVO" insert="true" update="true"> <column name="POPEDOM_ID" sql-type="INT(10)"/> </many-to-many> </bag>[/code:1] 但是save的时候,他没有插EXM_ROLE_POPEDOM表,是没有这个功能还是我代码写的不对? [code:1] RoleVO role = (RoleVO) obj; if (null != popedoms) { List tmp = new ArrayList(); for (int i = 0; i < popedoms.length; i++) { PopedomVO popdom = dao.selectByPK(popedoms[i].longValue()); //popdom.getRoles().add(role); tmp.add(popdom); } role.setPopedoms(tmp); } ds.insert(role);[/code:1] 其中PopedomVO已经有数据,现新增加一条RoleVO记录,关联上几条PopedomVO数据。但是RoleVO插进去了,关机就是没有,请教了…… 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2003-09-16
[code:1]
inverse="true" [/code:1] 这里错了,应该为默认的"false" |
|
| 返回顶楼 | |
|
时间:2003-09-16
试过了,也不灵
[code:1] <bag name="popedoms" lazy="true" table="EXM_ROLE_POPEDOM" cascade="all" role="popedoms"> <key> <column name="ROLE_ID" sql-type="INT(10)"/> </key> <many-to-many class="cn.mBig.experience.vo.PopedomVO"> <column name="POPEDOM_ID" sql-type="INT(10)"/> </many-to-many> </bag>[/code:1] [code:1] RoleVO role = (RoleVO) obj; PopedomDAO dao = new PopedomDAO(ds); if (null != popedoms) { List tmp = new ArrayList(); for (int i = 0; i < popedoms.length; i++) { PopedomVO popdom = dao.selectByPK(popedoms[i].longValue()); tmp.add(popdom); } role.setPopedoms(tmp); } session.saveOrUpdate(role); session.flush();[/code:1] |
|
| 返回顶楼 | |
|
时间:2003-09-16
[code:1]
但是RoleVO插进去了,关机就是没有,请教了…… [/code:1] 不是很明白你的意思,请提供详细的代码及映射。 |
|
| 返回顶楼 | |
|
时间:2003-09-16
打错了,应该是“关系就没保存”
就是Role 和 Popedom 的link table EXM_ROLE_POPEDOM 没有被记录 role 对 popedom是多对多的关系,这两张表通过role_popedom对应起来。 现在有一些popedom记录,希望在插入新的role的时候,同时确定role_popedom的关系并且插到link table中。 role的数据是通过页面输入的,通过checkbox选择需要的popedomId 放入数组。 根据popedomId 取得对应的 popedom实例,增加到role的List形的 popedoms里,保存role. 结果只hibernate只insert了role表,没搭理role_popedom... |
|
| 返回顶楼 | |
|
时间:2003-09-16
请提供 完整的 代码及映射。
|
|
| 返回顶楼 | |
|
时间:2003-09-16
[code:1] <class name="eg.RoleVO" table="EXM_ROLE">
<id name="id" type="java.lang.Long" unsaved-value="0"> <column name="ID" sql-type="INT(10)"/> <generator class="identity"/> </id> <property name="name"> <column name="NAME" not-null="true" sql-type="VARCHAR(40)"/> </property> <property name="creationDate" type="timestamp" column="CREATIONDATE"/> <property name="modificationDate" type="timestamp" column="MODIFICATIONDATE"/> <property type="java.lang.Long" name="creationUid"> <column name="CREATION_USER_ID" sql-type="INT(10)"/> </property> <property type="java.lang.Long" name="modificationUid"> <column name="MODIFICATION_USER_ID" sql-type="INT(10)"/> </property> <property name="description"> <column name="DESCRIPTION" sql-type="VARCHAR(255)"/> </property> <bag name="popedoms" lazy="true" table="EXM_ROLE_POPEDOM" cascade="all"> <key> <column name="ROLE_ID" sql-type="INT(10)"/> </key> <many-to-many class="eg.PopedomVO" insert="true" update="true"> <column name="POPEDOM_ID" sql-type="INT(10)"/> </many-to-many> </bag> <property type="java.lang.Byte" name="state"> <column name="STATE" sql-type="TINYINT(1)"/> </property> </class> <class name="eg.PopedomVO" table="EXM_POPEDOM"> <id name="id" type="java.lang.Long" unsaved-value="0"> <column name="ID" sql-type="INT(10)"/> <generator class="identity"/> </id> <property name="name"> <column name="NAME" not-null="true" sql-type="VARCHAR(40)"/> </property> <property name="description"> <column name="DESCRIPTION" sql-type="VARCHAR(255)"/> </property> </class>[/code:1] [code:1] private Session s; private Long[] popedomPKs; private void insert() throws DAOException { RoleVO role = (RoleVO) obj; if (null != popedomPKs) { List tmp = new ArrayList(); for (int i = 0; i < popedomPKs.length; i++) { PopedomVO popdom = selectByPK(popedomPKs[i]); tmp.add(popdom); } role.setPopedoms(tmp); } session.saveOrUpdate(role); session.flush(); } private PopedomVO selectByPK(Long id) throws DAOException { PopedomVO vo = null; try { vo = new PopedomVO(); s.load(vo, id); } catch (Exception e) { throw new DAOException(e); } return vo; }[/code:1] |
|
| 返回顶楼 | |
|
时间:2003-09-16
[code:1]
if (null != popedoms) { List tmp = new ArrayList(); for (int i = 0; i < popedoms.length; i++) { PopedomVO popdom = dao.selectByPK(popedoms[i].longValue()); tmp.add(popdom); } role.setPopedoms(tmp); } [/code:1] 确定if(null != popedoms)为true吗? |
|
| 返回顶楼 | |
|
时间:2003-09-16
确定!贴上的代码把调试输出去掉了,下面的是原来的,
tmp里数据都是正确的 [code:1] private Session s; private Long[] popedomPKs; private void insert() throws DAOException { RoleVO role = (RoleVO) obj; System.err.println("===================="); if (null != popedomPKs) { System.err.println(popedoms[i]); List tmp = new ArrayList(); for (int i = 0; i < popedomPKs.length; i++) { PopedomVO popdom = selectByPK(popedomPKs[i]); tmp.add(popdom); } role.setPopedoms(tmp); } for (java.util.Iterator i = tmp.iterator(); i.hasNext(); ) { System.err.println( ( (PopedomVO) i.next()).getName()); } session.saveOrUpdate(role); session.flush(); } [/code:1] |
|
| 返回顶楼 | |
|
时间:2003-09-16
把所有代码,映射贴出来吧,帮你调试一下。
|
|
| 返回顶楼 | |






