配置文件和pojo类如下:
<?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">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.hotel.dao.Movietype" table="movietype" catalog="hotelfidelio">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native"></generator>
</id>
<property name="name" type="java.lang.String">
<column name="name" length="60" not-null="true" />
</property>
<property name="field1" type="java.lang.String">
<column name="field1" length="20" />
</property>
<set name="movies"
table="movie"
inverse="true"
lazy="false"
cascade="all">
<key column="id_movietype"></key>
<one-to-many class="com.hotel.dao.Movie"/>
</set>
</class>
</hibernate-mapping>
<?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">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.hotel.dao.Movie" table="movie" catalog="hotelfidelio">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native"></generator>
</id>
<property name="moviename" type="java.lang.String">
<column name="moviename" length="200" not-null="true" />
</property>
<property name="movienameSys" type="java.lang.String">
<column name="moviename_sys" length="300" not-null="true" unique="true" />
</property>
<property name="director" type="java.lang.String">
<column name="director" length="200" />
</property>
<property name="impersonator" type="java.lang.String">
<column name="impersonator" length="200" />
</property>
<property name="charge" type="java.lang.Double">
<column name="charge" precision="22" scale="0" not-null="true" />
</property>
<property name="intro" type="java.lang.String">
<column name="intro" length="16277215" />
</property>
<property name="imgsrc" type="java.lang.String">
<column name="imgsrc" length="300" />
</property>
<property name="field1" type="java.lang.String">
<column name="field1" length="20" />
</property>
<property name="field2" type="java.lang.String">
<column name="field2" length="20" />
</property>
<property name="idmovietype" type="java.lang.Integer">
<column name="id_movietype" precision="3" scale="0" not-null="true" />
</property>
<many-to-one
name="movietype"
class="com.hotel.dao.Movietype"
column="id_movietype"
insert="false"
update="false"
outer-join="auto"
fetch="select"
access="property"
not-null="true"
lazy="false"
>
</many-to-one>
</class>
</hibernate-mapping>
网上很多帖子都说cascade="all" 就可以级联删除,但是我这里怎么设置都没法成功,观察输出日志
只有 movietype的删除 sql:
Hibernate: delete from hotel.movietype where id=?
之后看到 arthur.3726 文章:http://arthur-3726.iteye.com/blog/422877 发现只有用hibernate自带的事物执行语句才能执行级联删除,觉得有可能不是配置文件的问题,而是java代码的问题:
Eclipse配置完ssh后,自动生成的代码:
public void delete(Movietype persistentInstance) {
log.debug("deleting Movietype instance");
try {
getHibernateTemplate().delete(persistentInstance);
log.debug("delete successful");
} catch (RuntimeException re) {
log.error("delete failed", re);
throw re;
}
}
改成直接由hibernate的session来执行:
public void delete_cascade(final Movietype persistentInstance) {
log.debug("deleting Movietype instance");
try {
getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(Session s)
throws HibernateException, SQLException {
s.setFlushMode(FlushMode.AUTO);
s.beginTransaction().begin();
s.delete(persistentInstance);
s.beginTransaction().commit();
s.close();
return null;
}
});
} catch (RuntimeException re) {
log.error("find all failed", re);
throw re;
}
}
测试删除movietype,输出sql语句:
Hibernate: delete from hotelfidelio.movie where id=?
Hibernate: delete from hotelfidelio.movietype where id=?
删除成功。
参考:http://arthur-3726.iteye.com/blog/422877
http://docs.jboss.org/hibernate/stable/core/reference/en/html_single/#objectstate-transitive
http://docs.jboss.org/hibernate/stable/core/reference/en/html/objectstate.html#objectstate-transitive
http://docs.jboss.org/hibernate/stable/core/reference/en/html/example-parentchild.html
分享到:
相关推荐
在文档中提到的场景下,我们来详细探讨Hibernate级联删除的原理和配置方法。 首先,我们要理解关系映射中的几个关键概念。在给出的例子中,有四个表:A、AA、B和BB,它们之间存在一对多(one-to-many)和一对一...
本文将深入探讨如何在Hibernate中处理Many-to-Many关系的级联保存、级联更新和级联删除。 一、Many-to-Many关系基础 在数据库设计中,Many-to-Many关系意味着两个实体之间存在多对多的关系。例如,学生可以选修多门...
4. **级联查询示例**:例如,一个用户可以有多个订单,当删除用户时,如果设置了级联删除,那么相关的订单也会被一起删除。 5. **级联操作的优缺点**:优点是简化了代码,提高了开发效率;缺点是如果不合理使用,...
2. 级联删除(Cascade Type.REMOVE) 当设置为`CascadeType.REMOVE`时,如果删除了父实体,与之关联的子实体也会被删除。这在处理一对多或者多对多关系时非常有用,可以确保相关的数据在数据库中得到一致性的清理。...
在这个" Hibernate级联操作一对多demo "中,我们将探讨如何在一对多的关系中应用级联操作。 一对多关系是数据库中常见的关系类型,它表示一个实体(如部门)可以有多个相关实体(如员工)。在Hibernate中,这种关系...
本主题将深入探讨"hibernate级联增删改查",特别是针对"t_card主表"和"t_person从表"的关系。 首先,级联操作在Hibernate中是一种配置,用于指定当主表中的实体发生变化时,是否以及如何更新或删除关联的从表实体。...
一、Hibernate级联(Cascade) 级联操作允许我们将对一个实体的更改自动应用到与之关联的其他实体。在一对多关系中,如果一个实体(父实体)与多个实体(子实体)关联,设置级联属性可以确保在处理父实体时,子实体...
在 Hibernate 中,级联操作(Cascade)和反向属性(Inverse)是管理对象关系的重要概念,特别是在处理一对多(One-to-Many)或多对一(Many-to-One)关系时。 **级联操作(Cascade)** 级联操作定义了当主对象被...
在探讨Hibernate框架中的级联操作(cascade)与控制权反转(inverse)之前,我们需要先对Hibernate有一个基本的理解。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它为Java应用提供了一种将对象模型映射到...
在Java持久化框架Hibernate中,一对多(One-to-Many)、多对一(Many-to-One)、级联(Cascading)、加载(Loading)和反转(Inversing)是关系映射的重要概念,它们对于理解如何在数据库和对象之间有效地管理关联至...
### Hibernate级联(Cascade)详解 #### 一、概述 Hibernate 是一款强大的对象关系映射 (ORM) 框架,它允许开发人员将 Java 对象模型映射到数据库表,从而极大地简化了数据访问层的开发工作。在 Hibernate 中,...
级联关系在Hibernate中是指当一个实体发生某种操作(如保存、更新、删除)时,是否会影响到与之相关联的其他实体。通过配置级联关系,我们可以控制这些关联实体的行为。 1. **一对多(OneToMany)**:在数据库中,...
首先,级联关系是指当对主对象进行某些操作(如保存、更新、删除等)时,这些操作也会自动应用到与之相关联的从属对象上。这减少了代码量,并保持了数据的一致性。在Hibernate中,可以通过在`@ManyToOne`或`@...
在这个"struts2 hibernate 实现无限级联 树形分类"项目中,主要目标是创建一个能够展示无限级联的树形分类结构。这种结构通常用于组织层次化的数据,如产品类别、部门结构或者权限角色等。无限级联意味着这个树可以...
而级联(Cascading)则是Hibernate中处理关联对象的一种策略,它定义了当一个实体被保存、更新或删除时,与之关联的其他实体应该如何处理。 【描述】: Hibernate中的范型主要体现在SessionFactory、Session、...
在Oracle数据库中,多表级联删除是一种常见的需求,特别是在数据关系复杂的环境中。级联删除允许在删除一个表中的记录时,自动删除依赖于该记录的其他表中的相关记录。以下将详细介绍三种在Oracle中实现多表级联删除...
详解Hibernate cascade级联属性的CascadeType的用法 cascade(级联) 级联在编写触发器时经常用到,触发器的作用是当 主控表信息改变时,用来保证其关联表中数据同步更新。若对触发器来修改或删除关联表相记录,必须...
### Hibernate基础之关联映射与级联操作 #### 第一部分:主键生成策略与对象状态管理 ##### 主键生成策略 在使用Hibernate框架时,合理的主键生成策略能够极大地简化开发工作并提升应用性能。Hibernate提供了多种...
通过配置Hibernate的映射文件(hbm.xml),可以将数据库表与Java类关联起来,然后使用Session接口进行CRUD操作(创建、读取、更新、删除)。 实现三级城市级联的具体步骤可能包括以下部分: 1. **设计数据库模型**...
2. **数据完整性**:级联删除可能导致意外的数据丢失,因此在使用`CascadeType.DELETE`时需格外小心。 3. **事务管理**:级联操作通常在同一个事务中进行,确保数据一致性。如果不在同一个事务中,可能会引发并发...