-------------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。谢谢。
分享到:
相关推荐
但需要注意,过度使用级联查询可能会导致性能问题,因为它可能会引发"n+1查询"问题,即每获取一个父对象就查询一次子对象,这在数据量大时效率极低。 为了优化,可以考虑使用JOIN查询或二级缓存。在Hibernate中,...
缺点是如果不合理使用,可能导致数据安全问题,比如误删除大量数据,或者性能下降,因为级联操作可能导致过多的数据库交互。 6. **最佳实践**:在实际开发中,应根据业务需求谨慎选择级联类型,避免过度使用,同时...
级联操作通常涉及多个下拉列表,当用户在一个列表中做出选择时,这个选择会影响下一个列表的选项。例如,在一个国家-省份-城市的级联下拉中,选择国家后,省份列表会更新为该国的省份,接着选择省份后,城市列表会...
在这个例子中,父实体的`childEntity`属性将执行全部级联操作,包括添加、删除和更新,同时`delete-orphan`意味着如果从父实体的集合中移除了子实体,那么这个子实体也将被从数据库中删除。 6. 性能与最佳实践 级联...
在网页开发中,级联(Cascading)操作是一种常见的交互设计模式,特别是在涉及下拉框(Dropdown)选择时。这种技术允许用户在一个下拉框的选择基础上,动态更新另一个下拉框的内容,以提供更精确的筛选或选择。在本...
JSON级联查询是一种常见的前端开发技术,特别是在处理省市区选择这样的多级联动数据时。这种技术主要用于构建用户界面,使得用户能够逐级选择一个地区的省、市、区,每一步的选择都会更新下一步可选项,以确保数据的...
例如,如果我们设置了`CascadeType.ALL`,当保存或删除一个`Student`时,JPA会自动保存或删除所有相关的`Course`。 ```java // 在Student实体的courses属性上设置级联操作 @OneToMany(mappedBy = "student", ...
Oracle数据库中的级联查询、级联删除和级联更新是数据库设计中常用的操作,它们用于在多表关联的关系型数据库中实现数据的联动处理。在Oracle中,这些操作主要涉及外键约束和触发器。 首先,级联查询是通过自连接来...
"Ajax+SSH实现省份城市级联查询"是一个典型的示例,展示了如何利用这些技术提高用户体验,减少服务器负载。在此,我们将深入探讨Ajax、Spring、Hibernate和Struts2这四个关键技术以及它们在实现级联查询中的作用。 ...
在IT行业中,级联(Cascading)是一个广泛使用的概念,尤其在网页设计和数据处理中。本示例主要探讨了如何在JavaScript和jQuery中利用XML文件实现级联效果。XML(可扩展标记语言)是一种用于存储和传输结构化数据的...
在IT领域,动态实现下拉列表框的三级级联查询是一项常见的前端交互功能,它能够为用户提供更加便捷的导航和筛选体验。在这个场景中,我们使用JSP(JavaServer Pages)脚本语言来实现这一功能。JSP是Java平台上的...
4. **级联操作**:在级联过程中,每片74HC595的Q7'连接到下一片的DS,这样数据就会逐级传递。每片芯片都会按照同样的步骤接收和处理数据。 **代码说明**: 在进行74HC595的级联操作时,通常会编写相应的微控制器...
用户选择了一个选项,然后javascript脚本将该选项的值传递给服务器,服务器端的脚本将根据该值从数据库中查询相关数据,并将其返回给客户端,然后客户端根据返回的数据生成下一个级联菜单。 动态级联菜单的实现 ...
在IT行业中,jQuery是一个广泛使用的JavaScript库,它极大地简化了DOM操作、事件处理以及Ajax交互。本主题聚焦于“Jquery实现ajax二级级联查询”,这是一个常见的前端交互设计,常见于下拉菜单联动,例如省份选择后...
在Web应用中,用户点击一个菜单项,会触发下一级菜单的显示,这些子菜单可能包含更具体的操作或进一步的细分选项。 5. **实现步骤**: - **设计数据库模型**:首先,需要创建一个包含层次关系的数据库表,比如菜单...
行政区域级联查询js,可引用至网页。。
【全国银行网店级联数据】这个资源主要包含的是2012年左右我国各大银行的网点分布信息。在信息技术日益发达的今天,这样的数据对于研究我国银行业务布局、区域经济发展、金融普惠等方面具有重要意义。这份数据可能...
本篇将深入探讨JPA中的一对多双向关联及其级联操作,这对于理解和高效使用JPA进行数据操作至关重要。 一对多关联是数据库设计中的常见关系类型,一个实体可以拥有多个相关联的实体实例。在JPA中,这种关系可以通过...
在Compiere中,窗口级联操作是数据管理的一个重要特性,它允许用户在一个窗口中操作的数据会影响到关联的其他窗口或表中的数据,实现了数据的联动更新和一致性。在本例中,我们将探讨如何通过建表语句来实现这种级联...