【问题标题】:JPA Event to delete Entity from DB fired by deletion of an Entity from another Persistence Unit从另一个持久性单元中删除实体触发的 JPA 事件从数据库中删除实体
【发布时间】:2013-08-10 06:47:39
【问题描述】:

在我正在处理的应用程序中,有人将域对象拆分为不同的持久性单元。来自不同持久性单元的表之间的连接是基于包含 ID 的列,例如:

TableA             TableB
ID:Int             ID:int
Field1             TableA_ID:Int
Field2             ...  
...

TableA_ID 只是一个普通的 int,没有对其施加任何约束。现在我需要删除父实体(比如说TableA,还有所有连接的TableBs 实体)。在外键关系的情况下,这将是一个简单的 CASCADE 删除。 但在这种情况下,我应该如何进行? 数据库触发器 - 我想将所有内容都保留在 JPA 中。

谢谢!

【问题讨论】:

    标签: hibernate jakarta-ee persistence jpa-2.0 cascading-deletes


    【解决方案1】:

    如果您有 TableA 和 TableB 的 DAO,您可以通过这种方式使用协作来实现编写服务方法的解决方案(只是一个示例):

    @Repository
    class TableADAO {
      void deleteById(int id) {
        // perform deletion where TableA.ID == id
      }
    }
    
    @Repository
    class TableBDAO {
      void deleteTableAChildren(int id) {
        // perform deletion where TableA_ID == id
      }
    }
    
    @Service
    class MyService {
      private TableADAO tableADAO;
      private TableBDAO tableBDAO;
    
      @Transactional
      // Annotating as transactional to prevent
      // invalid data
      void deleteTableACascade(int idTableA) {
        tableBDAO.deleteTableAChildren(idTableA);
        tableADAO.deleteById(idTableA);
      }
    }
    

    这是一个合理的解决方案吗?

    【讨论】:

    • 感谢您的回复,是的,这将是最常见的方法。不幸的是,持久性级别是以非常通用的方式编写的,因此编写 DAO 至少可能很复杂。这就是为什么我更多地寻找基于触发器/事件的解决方案。
    • 好的,但我认为这种逻辑可以应用于各种情况:我认为 @Transactional() 不是使用 dao 而是在服务方法中执行原始 SQL,而是关注点,而不是方式你用来删除数据。我的 2 美分
    • 我终于通过使用 CDI 事件解决了这个问题。感谢您的支持。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 2011-07-16
    相关资源
    最近更新 更多