【问题标题】:HQL Delete on object with many to many/one-to-many mappings [duplicate]具有多对多/一对多映射的对象的HQL删除[重复]
【发布时间】:2016-02-02 16:27:38
【问题描述】:

我对如何使用 HQL 删除休眠实体有点困惑。我有实体Entity,这个实体有多个多对多/一对多映射。如果我使用 HQL 查询删除 Entity

Delete from Entity x where x.id = :id

hibernate 会负责删除实体配置文件中指定的子对象和关系吗?

【问题讨论】:

  • 这可能是对this的复述

标签: java sql oracle hibernate hql


【解决方案1】:

如果你正确地级联了你的类,hibernate 必须处理你的删除操作。但只有在提交更改之后。但是,如果您使用的是休眠,最好删除实体而不是表中的行

【讨论】:

  • 我正在使用休眠。我对 HQL 的功能更感兴趣,因为我想知道是否可以将此语句扩展到多行的批量删除操作
  • 无论如何,如果您的实体与cascadetype.removecascadetype.all 级联,则在删除父记录时,休眠必须删除所有子记录
  • 我在谈论使用 HQL 查询。从我在测试和stackoverflow.com/questions/7695831/… 中看到的情况来看,它似乎不适用于级联。我收到 oracle 异常通知我已找到子记录,因此无法删除该对象
  • 好的。看。您的 sql 数据库也有级联选项。因此,如果您想通过 HQL 查询删除实体(而不是通过 session.delete(entity),什么会更好),您需要转到数据库并为您的子表的外键创建 ON DELETE CASCADE。在这种情况下,您将能够删除父表中的一行,并且子表中的所有相关行也将被删除。 java2s.com/Code/SQLServer/Constraints/…
【解决方案2】:

级联选项在这种情况下很有用。 在 Hibernate 中有许多级联类型: ALL、PERSIST、MERGE、REMOVE、REFRESH、DELETE、SAVE_UPDATE等。您可以根据您的具体需要使用它们。 例子: @OneToMany(mappedBy = "id",cascade = CascadeType.ALL)

参考: https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/annotations/CascadeType.html

【讨论】:

    猜你喜欢
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    相关资源
    最近更新 更多