下面是我的两个映射文件:
Blog:
<class name="Blog" table="blog">
<id name="id" column="id">
<generator class="identity"></generator>
</id>
<property name="title" type="string" column="title"></property>
<property name="content" type="string" column="content"></property>
<property name="datetime" type="date" column="createTime"></property>
<set name="comments" inverse="true" cascade="delete">
<key column="blogId"></key>
<one-to-many class="Comment"/>
</set>
</class>
Comment:
<class name="Comment" table="comment">
<id name="id" column="id">
<generator class="identity"></generator>
</id>
<property name="user" type="string" column="user"></property>
<property name="email" type="string" column="email"></property>
<property name="url" type="string" column="url"></property>
<property name="content" type="string" column="content"></property>
<property name="datetime" type="date" column="createTime"></property>
<many-to-one name="blog" class="Blog" column="blogId" not-null="true"></many-to-one>
</class>
当我运行程序的时候打印出来hibernate执行的sql语句是这样的:
Hibernate:
alter table comment
drop
foreign key FK38A5EE5FDE0F1321
Hibernate:
drop table if exists blog
Hibernate:
drop table if exists comment
Hibernate:
create table blog (
id integer not null auto_increment,
title varchar(255),
content varchar(255),
createTime date,
primary key (id)
) type=InnoDB
Hibernate:
create table comment (
id integer not null auto_increment,
user varchar(255),
email varchar(255),
url varchar(255),
content varchar(255),
createTime date,
blogId integer not null,
primary key (id)
) type=InnoDB
Hibernate:
alter table comment
add index FK38A5EE5FDE0F1321 (blogId),
add constraint FK38A5EE5FDE0F1321
foreign key (blogId)
references blog (id)
而我认为正确的情况下。最后一节添加外键关系的SQL语句应该是这样的:
alter table comment
add index FK38A5EE5FDE0F1321 (blogId),
add constraint FK38A5EE5FDE0F1321
foreign key (blogId)
references blog (id)
on delete cascade
结果我在删除Blog的时候抛出如下异常:
Cannot delete or update a parent row: a foreign key constraint fails (`blog/comment`, CONSTRAINT `FK38A5EE5FDE0F1321` FOREIGN KEY (`blogId`) REFERENCES `blog` (`id`))
我程序的main方法具体如下:
public static void main(String[] args) {
Session session = HibernateUtil.currentSession();
Blog blog = new Blog();
blog.setTitle("a title");
session.save(blog);
Comment comment = new Comment();
comment.setContent("good");
comment.setBlog(blog);
session.save(comment);
session.delete(blog);
session.flush();
HibernateUtil.closeSession();
}
相关推荐
* 外键绑定关系这里使用了“ON DELETE CASCADE”和“ON UPDATE CASCADE”,意思是如果外键对应数据被删除或者更新时,将关联数据完全删除或者相应地更新。 MySQL 中的外键可以强制实施数据的一致性和完整性,使得...
本示例主要讲解如何利用LINQ通过外键来实现数据库中的级联添加和删除操作,特别适合初学者学习。我们将使用Visual Studio 2008以及内置的数据库文件,不适用于VS2003和VS2005。 首先,理解外键的概念。在关系型...
在Hibernate中,级联操作可以通过`cascade`属性进行配置。主要有以下几种级联类型: 1. `save-update`:当保存或更新父实体时,会自动保存或更新所有关联的子实体。 2. `merge`:在调用`session.merge()`时,不仅...
- `CASCADE`: 当主键表中的记录被删除或更新时,自动更新或删除外键表中的对应记录。 - `SET NULL`: 当主键表中的记录被删除时,外键列的值设为NULL(如果允许的话)。 - `RESTRICT`: 默认行为,不允许直接删除或...
在IT领域,尤其是在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它允许开发者用面向对象的方式操作数据库。尽管随着Spring Data JPA等现代技术的崛起,Hibernate的使用频率有所下降,但其核心...
### Hibernate Many-to-One (多对一) 及 Cascade (级联) #### 一、Many-to-One(多对一) 在数据库设计中,实体之间的关系主要包括一对一、一对多、多对多等几种类型。而在ORM(对象关系映射)框架Hibernate中,...
4. **all**: 该选项包含了所有其他cascade选项的功能,即级联保存、更新以及删除。但是,在解除父子关系时,不会自动删除子实体。 5. **delete-orphan**: 这个选项主要用于删除所有与当前实体解除关联的子实体。...
总结来说,MySQL中的外键和级联操作是数据库设计中不可或缺的一部分,它们确保了数据的一致性和引用完整性。在实际应用中,需要根据业务需求和性能考虑来合理使用级联删除和更新,以达到最佳的数据管理效果。同时,...
这段代码表示`BrBasic`类中的`cityInfo`属性(假设是`CityInfo`类型的)对应`br_basic`表的`fk_city`列,并且使用了全级联(cascade="all"),这意味着对`BrBasic`对象的操作会同步影响到`CityInfo`对象。...
在`Person`实体的映射中,我们设置了`cascade="all"`,这意味着当`Person`被保存、更新或删除时,与其关联的`IdentityCard`也会同步操作。当然,你可以根据需求调整这个策略。 ### 3. 操作关联对象 在代码中,我们...
这里,`name`属性表示在实体类中的属性名,`class`属性指定了关联实体的全限定类名,`foreign-key`用于指定外键的名称,`cascade`用于定义级联操作,`unique`属性确保了唯一性。 **4. 实体类的Java代码** 在实体类...
在Java持久化框架Hibernate中,级联操作是处理对象关系映射(ORM)时非常重要的一个特性。级联操作允许我们在对一个实体进行操作时,自动地影响与之相关的其他实体,无需显式地处理这些关联。在这个" Hibernate级联...
同样,删除User时,如果不希望同时删除关联的Order,需要设置级联操作(如`cascade = CascadeType.ALL`)。 总结起来,Hibernate中的一对多/多对一关联是通过主外键映射来实现的,通过注解和配置文件定义实体间的...
MySQL的InnoDB存储引擎支持多种不同的处理外键的方式,包括级联更新(Cascade Update)和级联删除(Cascade Delete)。本文将深入探讨这两种机制及其在MySQL中的实现方式。 #### 一、基本概念 **级联更新(Cascade ...
本篇将详细讲解如何使用Hibernate进行一对一单向外键关联,并且该关联涉及到联合主键的注解配置。 首先,一对一关联可以分为两种类型:单向和双向。在单向一对一关联中,只有一个实体知道另一个实体的存在,而另一...
6. ** Cascade操作**:在配置一对多关联时,可以设置级联操作,比如CascadeType.ALL,这意味着对父对象的操作(如保存、删除)会自动应用到所有子对象。 7. **Fetch策略**:可以选择懒加载(Lazy Fetch)或立即加载...
1. Hibernate 级联操作与 `cascade` 属性: Hibernate 提供了级联操作功能,使得对一个实体的保存、更新、删除等操作可以自动影响与其关联的其他实体。在 Hibernate 中,`cascade` 属性用于指定这种级联行为。题目...
### SQL 存在检测、建库、建表、约束、外键、级联删除知识点解析 #### 一、SQL 存在检测 在 SQL 语言中,存在检测主要用于判断某个对象(如数据库、表等)是否存在,从而决定是否执行后续的操作。这在创建或删除...
例如,删除Person时,通常也需要同时删除其Address,这可以通过`cascade`属性来配置。 总结,Hibernate的一对一唯一外键关联映射主要涉及映射配置、Java代码、数据库设计以及对象的操作和查询。在实际开发中,我们...
### SQL存在检测、建库、建表、约束、外键、级联删除 #### 一、SQL存在检测 **存在检测**是SQL中一个非常重要的功能,它可以帮助开发者避免重复创建或修改数据库对象(如数据库、表等)。通过检查特定的对象是否...