当前位置: 首页 > 面试题库 >

使用元素集合时,如何在JPA中批量删除?

令狐和裕
2023-03-14
问题内容

Person 对象包含使用 @ElementCollection 存储的数据时,我在解决如何使用JPA 批量删除 Person
对象方面遇到麻烦。任何有关如何执行此操作的想法将不胜感激。

@Entity
@Table(name="at_person")
public class Person implements Comparable<Person> {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="id")
    private long id = 0;

    @Column(name="name", nullable = true, length = 128)
    private String name = "";

    @ElementCollection
    @Column(name = "email")
    @CollectionTable(name = "person_email", joinColumns = @JoinColumn(name = "person_id"))
    private Set<String> email = new HashSet<String>();
}

我现在正在做的是,它因外键约束错误而失败:

Query query=em.createQuery("DELETE FROM Person");

引起原因:java.sql.SQLException:违反完整性约束:外键无动作;FKCEC6E942485388AB表:PERSON_EMAIL

如果它可以是纯JPA注释,而不是Hibernate注释,那将是一个加分!


问题答案:

我将让您解释JPA 2.0规范中提到批量删除操作未级联的部分:

4.10批量更新和删除操作

删除操作仅适用于指定类及其子类的实体。 它不会级联到相关实体

事实是,Hibernate也不会将删除操作级联到集合表。在HHH-5529中已对此进行了报告,建议的方法是:

您也可以(a)自己清理收集表,或(b)在模式中使用级联外键。

换句话说,(一)使用本地SQL或(b)在数据库级别使用级联删除约束-你必须手动添加它,我 不认为
你可以用@OnDelete@ElementCollection注释(同样的故事,HHH
-4301
IMO)。



 类似资料:
  • AFAIK,有两种方法: 迭代集合的副本 使用实际集合的迭代器 例如, 而且 有没有理由偏爱一种方法而不是另一种方法(例如,由于可读性的简单原因而偏爱第一种方法)?

  • 问题内容: 我正在对JRE 进行迭代,该JRE 强制执行快速失败迭代器概念,因此如果在迭代时修改了,则会抛出a ,而不是使用method。但是,如果对象满足条件,则需要删除该对象的“逻辑伙伴”。从而阻止伙伴也被处理。我怎样才能做到这一点?也许为此使用更好的收集类型? 例。 谢谢。 问题答案: 您要从列表中删除项目,然后继续在同一列表中进行迭代。您是否可以实施两步解决方案,即在步骤1中将要删除的项目

  • 问题内容: AFAIK有两种方法: 遍历集合的副本 使用实际集合的迭代器 例如, 和 是否有任何理由偏爱一种方法(例如,出于可读性的简单原因而偏爱第一种方法)? 问题答案: 让我举几个例子,并提出一些避免方案。 假设我们有以下藏书 收集并删除 第一种技术是收集所有要删除的对象(例如,使用增强的for循环),并在完成迭代后删除所有找到的对象。 假设你要执行的操作是“删除”。 如果要“添加”此方法也可

  • 如何查询包含至少一个搜索条件元素的? 给定这个对应的数据库模式 对于此实体类 我想在数据库中查询有产品列表的公司。在SQL中我可以做 等效的HQL/JPQL查询是什么样子的? 我找到了Hibernate的集合相关表达式和限定路径表达式,但是我无法创建一个有效的查询。 > 作为命名参数 org . spring framework . Dao . invaliddataaccessapiusagee

  • 问题内容: 最近,我编写此代码时并没有考虑太多: 其中,将删除该项目。 现在看一下代码,我对为什么它甚至起作用感到困惑-我是否不应该得到类似的例外?当使用常规的for-in循环时,甚至可以使用相同的代码! 这是预期的行为吗?还是我很幸运,它没有崩溃? 问题答案: 这确实是预期的行为–这是由于Swift(以及标准库中的许多其他集合)是一种具有写时复制语义的值类型的事实。这意味着其基础缓冲区(间接存储

  • 问题内容: 我在Web应用程序中通过Hibernate使用JPA。这是两个实体(仅显示吸气剂): 如您所见,并称为“一对多”。 现在,我需要加载一个实例,删除部分或全部子代并保存更改。以下是对我不起作用的代码: 在上面的示例中未删除子实体。现在,我必须手动为每个孩子打电话。 有没有更简单的方法来管理子代? 请注意,我不想使用特定于Hibernate的功能,只能使用纯JPA。 问题答案: 对于JPA