关于一个级联“查询操作”,如果用事务提交的话会删除数据,不知道在哪里写错了。...

本文探讨了一个关于Hibernate框架中多对多关系映射的问题。具体表现为,在使用Hibernate进行多对多关系的数据查询时,虽然没有预期中的事务操作,却意外触发了数据删除行为。通过分析代码和执行结果,博主寻求社区的帮助来找出问题所在。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-------------User.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 package="com.accp.demo">
<class name="User" table="t_user">
<id name="userId">
<generator class="native" />
</id>
<property name="userName" />
<many-to-one name="role" class="Role" column="roleId" />
</class>
</hibernate-mapping>


-----------Role.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 package="com.accp.demo">
<class name="Role" table="t_role">
<id name="roleId">
<generator class="native" />
</id>
<property name="roleName" />
<set name="users" cascade="save-update" inverse="true">
<key column="roleId"/>
<one-to-many class="User"/>
</set>
<set name="rights" table="t_role_right" cascade="save-update">
<key column="roleId" />
<many-to-many class="Right" column="rightId" />
</set>
</class>
</hibernate-mapping>


-----------------Right.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 package="com.accp.demo">
<class name="Right" table="t_right">
<id name="rightId">
<generator class="native" />
</id>
<property name="rightName" />
<set name="roles" table="t_role_right" cascade="save-update">
<key column="rightId"/>
<many-to-many class="Role" column="roleId"/>
</set>
</class>
</hibernate-mapping>


-----------------Many2manyTest.java-----------------

package com.accp.demo;

import java.util.Iterator;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.junit.Test;

import com.accp.demo.utils.HibernateUtils;

public class Many2manyTest {
@Test
public void searchUserRights() {
Session session = null;
try {
session = HibernateUtils.getSession();
User user = (User)session.get(User.class, 1);
System.out.println(user.getRole().getRoleName());
Iterator itr = user.getRole().getRights().iterator();
while(itr.hasNext()){
Right right = (Right)itr.next();
System.out.println(right.getRightName());
}
session.beginTransaction().commit();
} catch (HibernateException e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
HibernateUtils.closeSession(session);
}
}
}


====================执行结果如下=====================
Hibernate: select user0_.userId as userId0_0_, user0_.userName as userName0_0_, user0_.roleId as roleId0_0_ from t_user user0_ where user0_.userId=?
Hibernate: select role0_.roleId as roleId1_0_, role0_.roleName as roleName1_0_ from t_role role0_ where role0_.roleId=?
manager
Hibernate: select rights0_.roleId as roleId1_, rights0_.rightId as rightId1_, right1_.rightId as rightId3_0_, right1_.rightName as rightName3_0_ from t_role_right rights0_ left outer join t_right right1_ on rights0_.rightId=right1_.rightId where rights0_.roleId=?
search user
delete user
Hibernate: delete from t_role_right where rightId=?
Hibernate: delete from t_role_right where rightId=?

------------------------------------------
其中很奇怪多执行了如下操作
Hibernate: delete from t_role_right where rightId=?
Hibernate: delete from t_role_right where rightId=?

查询不用事务是没问题,但我执行了事务后怎么就删除数据了。
大家帮我分析一下why。谢谢。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值