hibernate执行多对多关联查询时,关联表数据被删除
本帖最后由 binbb521 于 2012-12-04 11:48:29 编辑 S2SH框架开发的网站,执行两个多对多关系的表查询时,关联两个表的中间表数据被删除,麻烦各位大牛看一下,很急,解决立马结贴,谢谢了!
ZqAdminPermission.hbm.xml
<set name="zqAdminModuleses" table="zq_admin_modules_permission" lazy="false">
<key>
<column name="admin_permission_id" length="36" not-null="false" />
</key>
<many-to-many column="admin_modules_id" class="com.zqqywssh.vo.ZqAdminModules"></many-to-many>
</set>
ZqAdminModules.hbm.xml
<set name="ZqAdminPermissions" inverse="true" table="zq_admin_modules_permission">
<key>
<column name="admin_modules_id" length="36" not-null="false" />
</key>
<many-to-many column="admin_permission_id" class="com.zqqywssh.vo.ZqAdminPermission"></many-to-many>
</set>
根据ID查询ZqAdminPermission表中的数据时,应自动将关联的ZqAdminModules数据查出,结果这两个表的关联表的数据自动被删除了,导致查询得到了空集合
public ZqAdminPermission findById(final String id) {
ZqAdminPermission zqAdminPermission = getHibernateTemplate().execute(new HibernateCallback<ZqAdminPermission>() {
public ZqAdminPermission doInHibernate(Session session) throws HibernateException,SQLException {
String hql = "from ZqAdminPermission zap where zap.adminPermissionId=:id";
Query query = session.createQuery(hql);
query.setString("id", id);
List list = query.list();
if(list.size()==0) return null;
return (ZqAdminPermission)list.get(0);
}
});
return zqAdminPermission;
}
[最优解释]
我现在把代码改成
public ZqAdminPermission findById(final String id) {
String queryString="from ZqAdminPermission zap left join fetch zap.zqAdminModuleses where zap.adminPermissionId=?";
List list = getHibernateTemplate().find(queryString,id);
if(list.size()==0) return null;
return (ZqAdminPermission)list.get(0);
}
依然是查询数据时就把数据删了。。
[其他解释]
如果存在这个设置:
<property name="hibernate.hbm2ddl.auto">delete</property>
那么直接删除就行。hbm2ddl.auto这个设置不要没关系的。
------其他解决方案--------------------
楼主为何要用hibernateCallBack
直接用getHibernateTemplate().find(String query,Object... values)
[其他解释]
测试过了,用find也是这种情况
[其他解释]
有没有大神帮忙看下这个诡异的问题啊,在别的类中操作的方法基本一致都没有问题,怀疑是映射的问题,可是映射检查过也是一样的,不知道为什么单纯的查询数据会导致数据被删除!
[其他解释]
ZqAdminPermission zqAdminPermission = getHibernateTemplate().execute(new HibernateCallback<ZqAdminPermission>() {
这个
HibernateTemplate执行execute(new HibernateCallback())方法,从HibernateCallback中得到session,在此session中做多个操作,并希望这些操作位于同一个事务中。
回调实际就是一种事件触发模式,就象连环地雷一样,一旦触发一个,这个再触发另外一个,你在find这个方法被执行时,希望同时执行其他方法,就需要回调。
楼主不需要执行多个方法就不用加这个回调的东西了吧!
[其他解释]
1. 检查一下你的连接是不是走的删除的方法。
2. debug一下你这个action的处理的地方。
[其他解释]
不是走的删除方法
一直是跟断点走的,走一步看一下数据库,就在find()方法执行完查询后,数据被删除的
[其他解释]
public ZqAdminPermission findById(String id) {
try {
String hql = "from ZqAdminPermission zap where zap.adminPermissionId='"+id+"'";
logger.debug("hql:"+hql);
List<ZqAdminPermission> list=this.getHibernateTemplate().find(hql);
if(list.size()>0){
return list.get(0);
}
} catch (Exception e) {
throw new DataException(e.toString(), null);
}
return null;
}
不要看数据库,看看你每行走的代码,就是跳转到实现类里面每一步也看一下。尤其是你查询中的每一行和你执行完后的操作。
最好贴一下你action处理的方法!
[其他解释]
public void findById(){
ZqAdminPermission zqAdminPermission=zqAdminPermissionService.findById(adminPermissionId);
ServletActionContext.getRequest().setAttribute("permission", zqAdminPermission);
}
action是这样的,很简单的,跳转到Service里面直接到DAO查的数据,中间没做任何处理步骤
[其他解释]
真个代码根本就不报任何错,控制台不打印,页面也没显示,单独运行action也不出错,以前的代码都没什么问题,所以怀疑是映射的问题,您帮忙看下多对多映射那样写有没有什么问题呢?
[其他解释]
求分析求帮助!!
[其他解释]
我想的是:你走的是查询方法,跟删除根本没关系的吧,但是执行查询竟然将数据删除,这个是很神奇的事情啊!我想的是你走的链接是删除的方法或者是你调用方法的过程中调用成删除的了。映射这个东西是帮你获取数据的跟删除没什么关系的。
还有一点:从你的sql语句来看用不到多对多什么的啊,最多是一对多的关系。
[其他解释]
新建的类库,还没写删除的方法,目前只是刚要读取一个列表数据,设计的时候是多对多的
[其他解释]
多对多的话,你中间表里面分别是另外两张关联表的主键,是不是总共这两个字段?如果是的话作为这张表的复合主键和复合外键,这个时候的这个关联表是不生成hibernate映射文件的。 你是不是还有这个关联表的映射文件呢?
[其他解释]
+1
[其他解释]
楼主,把hibernate的配置信息发上来。
hibernate.cfg.xml
其中有项:
<!--自动根据hbm生成ddl。-->
<property name="hibernate.hbm2ddl.auto">update</property>
你可能设置成:
<property name="hibernate.hbm2ddl.auto">delete</property>
也可能是设置在spring里面了。请楼主找出来然后把hibernate的配置信息贴出来。
不是程序的问题。估计是hibernate设置出问题了。
[其他解释]
谢谢各位!问题解决了,只是实体类中的getset方法少了一个this.
[其他解释]
null
[其他解释]
积累经验啊!!