代码之家  ›  专栏  ›  技术社区  ›  Matelutex

如何删除实体和子项

  •  1
  • Matelutex  · 技术社区  · 6 年前

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

    @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;
    

    只有日志记录表有列 action_id 作为一个 FOREIGN KEY .

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

    问题是:我如何删除在某个日期之前有日期并且有某个域(位于日志表中)的所有操作实体? 例如

    deleteActionByDateAndDomain(LocalDateTime date, String domain)
    

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

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

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

    提前非常感谢!

    1 回复  |  直到 6 年前
        1
  •  1
  •   NiVeR    6 年前

    通过设置属性,可以指定层叠类型以层叠删除操作 cascade = CascadeType.REMOVE 但如果使用不当,可能会导致一些头痛:

    • 如果您错误地删除了一些记录,可能会在级联中删除大量数据。
    • 由于Hibernate执行了许多查询,应用程序可能会变慢。( link )

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

    推荐文章