0 0

hibernate4 外键级联删除cascade="delete"属性失效不起作用5

下面是我的两个映射文件:
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();
}

1个答案 按时间排序 按投票排序

0 0

楼主,问题解决了没有

2017年8月14日 22:31

相关推荐

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

    * 外键绑定关系这里使用了“ON DELETE CASCADE”和“ON UPDATE CASCADE”,意思是如果外键对应数据被删除或者更新时,将关联数据完全删除或者相应地更新。 MySQL 中的外键可以强制实施数据的一致性和完整性,使得...

    LINQ通过外键级联添加和删除数据库的示例

    本示例主要讲解如何利用LINQ通过外键来实现数据库中的级联添加和删除操作,特别适合初学者学习。我们将使用Visual Studio 2008以及内置的数据库文件,不适用于VS2003和VS2005。 首先,理解外键的概念。在关系型...

    hibernate many-to-many级联保存,级联更新,级联删除

    在Hibernate中,级联操作可以通过`cascade`属性进行配置。主要有以下几种级联类型: 1. `save-update`:当保存或更新父实体时,会自动保存或更新所有关联的子实体。 2. `merge`:在调用`session.merge()`时,不仅...

    Hibernate使用外键ForeignKey

    - `CASCADE`: 当主键表中的记录被删除或更新时,自动更新或删除外键表中的对应记录。 - `SET NULL`: 当主键表中的记录被删除时,外键列的值设为NULL(如果允许的话)。 - `RESTRICT`: 默认行为,不允许直接删除或...

    Hibernate的缓存级联查询

    在IT领域,尤其是在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它允许开发者用面向对象的方式操作数据库。尽管随着Spring Data JPA等现代技术的崛起,Hibernate的使用频率有所下降,但其核心...

    hibernate many-to-one(多对一)及 cascade(级联).doc

    ### Hibernate Many-to-One (多对一) 及 Cascade (级联) #### 一、Many-to-One(多对一) 在数据库设计中,实体之间的关系主要包括一对一、一对多、多对多等几种类型。而在ORM(对象关系映射)框架Hibernate中,...

    hibernate_配置cascade_及all-delete-orphan.doc

    4. **all**: 该选项包含了所有其他cascade选项的功能,即级联保存、更新以及删除。但是,在解除父子关系时,不会自动删除子实体。 5. **delete-orphan**: 这个选项主要用于删除所有与当前实体解除关联的子实体。...

    MySQL使用外键实现级联删除与更新的方法

    总结来说,MySQL中的外键和级联操作是数据库设计中不可或缺的一部分,它们确保了数据的一致性和引用完整性。在实际应用中,需要根据业务需求和性能考虑来合理使用级联删除和更新,以达到最佳的数据管理效果。同时,...

    hibernate中的外键查询实现

    这段代码表示`BrBasic`类中的`cityInfo`属性(假设是`CityInfo`类型的)对应`br_basic`表的`fk_city`列,并且使用了全级联(cascade="all"),这意味着对`BrBasic`对象的操作会同步影响到`CityInfo`对象。...

    Hibernate一对一唯一外键关联映射(单向关联)

    在`Person`实体的映射中,我们设置了`cascade="all"`,这意味着当`Person`被保存、更新或删除时,与其关联的`IdentityCard`也会同步操作。当然,你可以根据需求调整这个策略。 ### 3. 操作关联对象 在代码中,我们...

    hibernate中基于外键的one2one

    这里,`name`属性表示在实体类中的属性名,`class`属性指定了关联实体的全限定类名,`foreign-key`用于指定外键的名称,`cascade`用于定义级联操作,`unique`属性确保了唯一性。 **4. 实体类的Java代码** 在实体类...

    Hibernate级联操作一对多demo

    在Java持久化框架Hibernate中,级联操作是处理对象关系映射(ORM)时非常重要的一个特性。级联操作允许我们在对一个实体进行操作时,自动地影响与之相关的其他实体,无需显式地处理这些关联。在这个" Hibernate级联...

    hibernate基于主外键的一对多/多对一关联

    同样,删除User时,如果不希望同时删除关联的Order,需要设置级联操作(如`cascade = CascadeType.ALL`)。 总结起来,Hibernate中的一对多/多对一关联是通过主外键映射来实现的,通过注解和配置文件定义实体间的...

    mysql级联更新和级联删除

    MySQL的InnoDB存储引擎支持多种不同的处理外键的方式,包括级联更新(Cascade Update)和级联删除(Cascade Delete)。本文将深入探讨这两种机制及其在MySQL中的实现方式。 #### 一、基本概念 **级联更新(Cascade ...

    Hibernate一对一单向外键关联 (联合主键annotation)

    本篇将详细讲解如何使用Hibernate进行一对一单向外键关联,并且该关联涉及到联合主键的注解配置。 首先,一对一关联可以分为两种类型:单向和双向。在单向一对一关联中,只有一个实体知道另一个实体的存在,而另一...

    Hibernate基于外键的一对多单向关联

    6. ** Cascade操作**:在配置一对多关联时,可以设置级联操作,比如CascadeType.ALL,这意味着对父对象的操作(如保存、删除)会自动应用到所有子对象。 7. **Fetch策略**:可以选择懒加载(Lazy Fetch)或立即加载...

    java开始面试的第27天.doc

    1. Hibernate 级联操作与 `cascade` 属性: Hibernate 提供了级联操作功能,使得对一个实体的保存、更新、删除等操作可以自动影响与其关联的其他实体。在 Hibernate 中,`cascade` 属性用于指定这种级联行为。题目...

    sql_存在检测、建库、_建表、约束、外键、级联删除[归类].pdf

    ### SQL 存在检测、建库、建表、约束、外键、级联删除知识点解析 #### 一、SQL 存在检测 在 SQL 语言中,存在检测主要用于判断某个对象(如数据库、表等)是否存在,从而决定是否执行后续的操作。这在创建或删除...

    hibernate一对一唯一外键关联映射(单项关联)

    例如,删除Person时,通常也需要同时删除其Address,这可以通过`cascade`属性来配置。 总结,Hibernate的一对一唯一外键关联映射主要涉及映射配置、Java代码、数据库设计以及对象的操作和查询。在实际开发中,我们...

    sql存在检测、建库、建表、约束、外键、级联删除[文].pdf

    ### SQL存在检测、建库、建表、约束、外键、级联删除 #### 一、SQL存在检测 **存在检测**是SQL中一个非常重要的功能,它可以帮助开发者避免重复创建或修改数据库对象(如数据库、表等)。通过检查特定的对象是否...

Global site tag (gtag.js) - Google Analytics