【问题标题】:How to remove entity and children如何删除实体和子项
【发布时间】:2018-05-22 18:17:19
【问题描述】:

我有一个问题要解决。我有两个实体:ActionLogging

@Entity
public class Action {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    ...other fields
    ...other fields


    @Column
    private Date start;

    @Column
    private Date end;


@Entity
public class Logging {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    @ManyToOne
    @JoinColumn(name = "action_id")
    private Action action;

    ..not important fields

    @Column
    private String domain;

    @Column
    private Date date;

只有 Logging 表具有 action_id 列作为 FOREIGN KEY

一个动作可以有多个日志记录。

问题是:如何删除日期早于某个日期并具有某个域(位于 Logging 表中)的所有 Action 实体? 例如

deleteActionByDateAndDomain(LocalDateTime date, String domain)

记录实体是所有者,对吗?那么,我应该删除 Action 实体,然后删除所有相关的 Logging 实体,例如 CASCADING 吗?或者相反 - 首先删除所有满足我条件的 Logging 实体(date before dateX and domain == myDomain 作为参数传递)?

您将如何实现它? 例如,我可以删除 Action 实体和所有相关的 Logging 实体,但 Action 实体中没有字段域(仅在 Logging 中)。

如果可能的话,我应该使用 CrudRepository 接口。

非常感谢您!

【问题讨论】:

    标签: java hibernate jpa persist


    【解决方案1】:

    你可以通过设置属性cascade = CascadeType.REMOVE来指定级联类型来级联删除操作,但是如果使用不当可能会让你有些头疼:

    • 如果误删了某条记录,可能会级联删除大量数据
    • 应用程序可能会因为 Hibernate (link) 执行的许多查询而变慢

    因此,如果您不希望出现这些问题,可以手动管理删除。当您删除一些记录时,您将知道还需要删除哪些记录。优点是您拥有更多控制权,并且可以根据需要通过创建批量删除来优化流程。

    【讨论】:

    • 那么,你说我应该手动删除所有的Logging记录?例如,我有一个 Action 记录和 5 个 Logging 记录指向这个 Action 记录(通过外键)。所以你说我应该先删除所有的Logging记录,然后手动检查是否有没有Logging记录的孤儿Action记录?问题是如何删除带有所有相关日志记录的操作记录。我们要按日期和域删除操作记录,但域位于 Logging 实体中。所以在我看来,我们必须从 Logging 实体开始,如果不存在 Logging 记录,最后删除 Action 实体。
    • 我说,当您需要删除Action 时,您首先要使没有Action 不应该存在的所有记录无效/删除,在您的情况下,所有Logging 都与之关联,然后删除Action本身,使数据库保持一致状态。
    • 好的,全部手动,没有级联等。但是我如何检查是否有没有与之相关的日志记录(操作)的操作记录,因为我已经删除了所有相关的日志记录条目?不应存在​​没有任何相关 Logging 条目的操作记录。
    • 对。您有关系记录 -> 操作。当您删除特定的日志时,请执行相关的操作,如果它没有日志,则将其删除。想法是一样的。
    • 是的,我相信您可以使用它,但它适用于 OneToOne 和 OneToMany 注释,因此您应该从 Action 实体定义关系。而且,从 jpa 文档来看,这种方法相当激进。我会手动完成。
    猜你喜欢
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多