级联删除

相信学过数据库基础的童鞋们都知道,当有两个表A和B,表A的外键正是表B的主键时,我们会发现,当我们用数据库语言对B表数据进行删除操作的时候,我们会发现根本就删除不了,所以呢,在实际代码中,想要通过点击删除就可以删除?那么就需要对其进行相关操作了,具体的呢,咱就一步一步来,我所写的是通过spring3+hibernate4+struts2+maven写的代码,里面有两个表department 和user,其department的主键did在user中作为外键,这时候就必然会在department.hbm.xml中配置多对多的关系,如下代码:

<hibernate-mapping package="com.cct.entity">
	<class name="Department" table="department">
		<id name="did" type="java.lang.Integer">
            <generator class="increment"/>
		</id>
		<property name="dname" type="java.lang.String"/>
		<property name="description" type="java.lang.String"/>
	<!--用户和部门之间的关系  -->
		<set name="users" inverse="true"  cascade="all">//cascade参数不要掉
		   <key>
		       <column name="did"></column>
		   </key>
		   <many-to-many class="com.cct.entity.User"></many-to-many>
		</set>
	</class>
</hibernate-mapping>

因为是通过spring的管理,所以在spring.xml中sessionfactory和transactionmanage的配置都要记得,具体代码如下:

<!-- session工厂 -->
     <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
                <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
            </props>
        </property>
        <property name="mappingResources">
            <list>
                <value>com/cct/entity/Department.hbm.xml</value>
                 <value>com/cct/entity/User.hbm.xml</value>
                  <value>com/cct/entity/Post.hbm.xml</value>
            </list>
        </property>
    </bean>
    <bean name="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory">
        <ref local="sessionFactory"/></property>
    </bean> 

      <tx:advice id="advice" transaction-manager="transactionManager">
    <tx:attributes>
      <tx:method name="save*" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>
      <tx:method name="delete*" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>
      <tx:method name="update*" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>
      <tx:method name="*"  read-only="true"/>
    </tx:attributes>
  </tx:advice>
<!--  5配置切入点  -->
   <aop:config>
     <!-- 配置切入点 ,这里的切入点应用的类级别 -->
     <aop:pointcut id="perform" expression="execution( *  com.cct.service..*.*(..))"/>
     <!-- 建立通知和切入点的结合 -->
     <aop:advisor advice-ref="advice" pointcut-ref="perform"/>
     </aop:config>

以上代码中,记得后面的对于transactionManager的处理(tx:开头的和aop:开头)一定不能掉了,在这部分进行了开启事务管理,如果掉了的话就会报错:No Session found for current thread,当然,除此之外,在写Dao层的时候,也需要注意的是,如果用的是hibernate3,则可以通过继承HibernateDaoSupport来通过hibernatetemplate来进行增删改查操作,当然也是不需要写transaction的开启和提交类似的语句的,如果是hibernate4的话,就需要在Dao中写下下面代码:

        @Resource
	private SessionFactory sessionFactory ;

通过spring注解特性,用@Resource对sessionfactory进行注入,这样的话在dao层的每个方法中通过sessionfactory.getCurrentSession.*()就可以直接进行增删改查操作,接下来关键的时候到了,那就是在删除操作中,需要进行判断,通过判断departmentservice传过来的参数DeleMode(这个是提前在单独类中定义一些静态变量)来做删除前的解除关系操作,解除关系之后就可以正常删除:

public void deleteDepartmentByID(Serializable id,String  deletemode) {
        Department departement=this.getDepartmentbyId(id);
        if("del".equals(deletemode))
        {
        sessionFactory.getCurrentSession().delete(departement);
        }
        else if("del_pre_release".equals(deletemode))//删除之前先解除关系
        {
            Set<User> departments=departement.getUsers();
            for(User user:departments)
            {
                user.setDepartment(null);
            }
        }
        else{//级联删除
        }
        sessionFactory.getCurrentSession().delete(departement);    

    }

这样的操作应该是比较常见的,所以有些问题需要注意一下。

时间: 04-25

级联删除的相关文章

java:Oracle(级联删除,左右内外交叉自然连接,子查询,all,any,in)

1.级联删除: -- 级联删除:裁员,公司倒闭 -- 级联删除(cascade),设置为null(setnull),放任不管(No action) -- cascade:(以一对多为例)如果删除多的一方,一的一方不受任何影响,但是如果删除一的一方,多的一方所有对应数据全部被删除 select * from staff s inner join department d on d.id = s.department_id; delete from staff s where s.id = 1; d

MySQL中利用外键实现级联删除、更新

MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定在删除.更新父表时,对子表进行的相应操作,包括RESTRICT.NO ACTION.SET NULL和CASCADE.其中RESTRICT和NO ACTION相同,是指在子表有关联记录的情况下父表不能更新:CASCADE表示父表在更新或者删除时,更新或者删除子表对应记录:SET NULL则是表示父表在更新或者删除的时候,子表的对应字段被S

关于数据的级联删除和更新

两张表:“ProductCategory”,“Product”. 有一个需求是这样的:在删除某个ProductCategory 的时候,同时删除该Category的products. 在MySQL中利用外键实现级联删除 创建以下测试用数据库表: CREATE TABLE `roottb` ( `id` INT(11) UNSIGNED AUTO_INCREMENT NOT NULL, `data` VARCHAR(100) NOT NULL DEFAULT '', PRIMARY KEY (`i

数据库事务测试以及级联更新级联删除

数据库事务 start transaction; #开始事务 insert into gzb(gz)values(5000); insert into gzb(gz)values(6000); insert into gzb(gz)values(7000); insert into gzb(gz)values(8000); /*执行事务,并查看是否添加成功数据*/ commit; # commit数据,查看表中数据是否提交 rollback; #数据库回滚 级联更新,级联删除 主要通过两种方式

sql server创建外键,子母表,级联删除。

级联删除. 最近建一个合同关系,在原有的资产平台上添加维保合同关系,维保合同问题, 需要在后面添加资产的维保合同,使用ef,该添加的冗余字段都已经添加上了,现在做这个,删除的时候只删了主表提示出问题,原来我没有在外键上选上  “级联删除”  属性 最终出现的结果就是要手动删了,这种做法是不对的!

Oracle之外键(Foreign Key)用法详解(二)- 级联删除(DELETE CASCADE)

Oracle外键(Foreign Key)之级联删除(DELETE CASCADE) 目标 示例讲解如何在Oracle外键中使用级联删除 什么是级联删除(DELETE CASCADE)? 级联删除是指当主表(parent table)中的一条记录被删除,子表中关联的记录也相应的自动删除. 外键的级联删除可以在创建表时定义,也可以使用ALTER TABLE语法定义. 创建表时定义级联删除 语法: CREATE TABLE table_name ( column1 datatype null/not

Entity Framework Code First级联删除

使用Data Annotations: 如果我们要到一对主从表增加级联删除,则要在主表中的引用属性上增加Required关键字,如: public class Destination { public int DestinationId { get; set; } public string Name { get; set; } public string Country { get; set; } public string Description { get; set; } public b

ITOO级联删除主从表

成绩系统有一个需求:数据字典有主从表,要求删除主表时候连同从表信息(跟牛腩中删除新闻时级联删除新闻评论相通),之前做好的那个版本中只删除主表数据,而且是按照主表数据的名称来删除,如果有重名的话还需做验证(感觉不太合理),现在需要做的是按照主表的ID来删除从表,主表的ID也能从页面拿到. 我的思路:主表的html中引用主从表两个js,主从表的调用的button的click方法名称相同,但结果它只能找到执行其中的一个方法,结果主表删除后从表没有反应. 后来李游给我思路:删除从表的js代码写在主表的触

Oracle外键级联删除和级联更新

1 级联删除 Oracle在外键的删除上有NO ACTION(类似RESTRICT).CASCADE和SET NULL三种行为. 下面以学生-班级为例说明不同情况下的外键删除,学生属于班级,班级的主键是学生的外键. -- 班级表 CRATE TABLE TB_CLASS ( ID NUMBER NOT NULL, --班级主键 NAME VARCHAR2(50), --班级名称 CONSTRAINT PK_TB_CLASS PRIMARY KEY (ID) ); -- 学生表 CREATE TA