我该如何使用datamanager删除带外键关系的实体数据?

我的数据结构应当是order包含多个orderitem的关系,因此存在外键在orderitem表中,指向order,当我使用datamanager的remove方法的时候,如果是datamanager.remove(order),会提醒外键关系,导致无法删除,而如果dataManager.remove(Order,OrderItems);,则是报错了这个信息Cannot merge an Entity that has been removed。我该如何处理,才能实现数据库删除这个数据?

在文档 删除实体 部分有如下说明:

如果要删除关联实体,那么参数的顺序就很重要了。要先传入依赖其他实体的实体,示例:

void removeOrderWithCustomer(Order order) {
    dataManager.remove(order, order.getCustomer());
}

所以,你可以这么试试:dm.remove(orderItems,order)

我交换后,报了这个错误:
IllegalArgumentException: Cannot merge an Entity that has been removed: com.*****.momexecution.entity.OrderItem-01011302-cb6c-1a67-fc81-344ea8973e54 [detached]
这是否意味着有其余关联关系?

请问是否能解决这个疑惑?

你好,我这边中午试了试,没有重现你的问题。
这是 Java 代码:

@Subscribe(id = "deleteOrder", subject = "clickListener")
public void onDeleteOrderClick(final ClickEvent<JmixButton> event) {
    var order = dataManager.load(Order.class)
            .query("select o from jmx2sp_Order o where o.name = 'del'")
            .one();

    var orderItems = dataManager.load(OrderItem.class)
            .query("select oi from jmx2sp_OrderItem oi where oi.order.id = :orderId")
            .parameter("orderId", order.getId())
            .list();

    dataManager.remove(orderItems,order);
}

这是日志输出,可以看到,是先删除 2 个 orderItem,再删除的 order,没出问题:

2024-11-26T15:55:02.391+08:00 DEBUG 6412 --- [nio-8080-exec-1] eclipselink.logging.sql                  : <t 715715932, conn 102211679> DELETE FROM JMX2SP_ORDER_ITEM WHERE (ID = ?)
	bind => [66035056-b716-5c91-10b8-2e6cf36b8813]
2024-11-26T15:55:02.392+08:00 DEBUG 6412 --- [nio-8080-exec-1] eclipselink.logging.sql                  : <t 715715932, conn 102211679> [1 ms] spent
2024-11-26T15:55:02.392+08:00 DEBUG 6412 --- [nio-8080-exec-1] eclipselink.logging.sql                  : <t 715715932, conn 102211679> DELETE FROM JMX2SP_ORDER_ITEM WHERE (ID = ?)
	bind => [c5d1010b-ca88-3efa-84df-0e9760e2b192]
2024-11-26T15:55:02.392+08:00 DEBUG 6412 --- [nio-8080-exec-1] eclipselink.logging.sql                  : <t 715715932, conn 102211679> [0 ms] spent
2024-11-26T15:55:02.392+08:00 DEBUG 6412 --- [nio-8080-exec-1] eclipselink.logging.sql                  : <t 715715932, conn 102211679> DELETE FROM JMX2SP_ORDER WHERE (ID = ?)
	bind => [00a16bb5-324e-7a27-0427-f675162ed742]

如果你的代码还是有问题,请上传相关代码(实体、业务逻辑)或者一个可重现问题的小项目。小项目请用下面的命令打包后上传:
image

非常感谢您的帮助,我现在将我的remove方法拆分开进行删除后,成功删除了我想删除的order
这是代码
dataManager.remove(deleteOrderExceptions);
dataManager.remove(deleteOrderItems);
dataManager.remove(deleteOrderPhases);
dataManager.remove(deleteOrderOperations);
dataManager.remove(deleteOrderUnitProcedures);
dataManager.remove(deleteOrderProcedures);
//重新获取新的order进行删除
dataManager.remove(dataManager.load(Order.class).id(deleteOrder.getId()).one());
经过我的测试这样删除就没有那些问题了,但是整体一次性删除,即使按照这个代码顺序删除,依然是有那个错误的。原因暂时未知,但是问题也算是解决了吧。

我会尝试使用您示例的sql语句方式也处理看看。

嗯。你的实体比较多,关联关系也复杂,所以还是按照你的方法一层一层删除比较不容易出错