我们已经在我们的 webshop 实现中实现了几个自定义 ORM 对象,这些对象具有对 Intershop Product 系统对象的引用(依赖关系)。
当用户试图在后台删除某个产品时,它会导致问题,因为对该产品的引用可能仍然存在于我们的自定义对象中。自然,删除从我们的自定义对象之一引用的产品会生成如下异常:
java.sql.SQLTransactionRollbackException: ORA-02091: transaction rolled back ORA-02292: integrity constraint (INTERSHOP.A1POSTPAIDPRICE_CO_002) violated - child record found
我们认为我们可以通过实现 ORMObjectListener 并覆盖 objectDeleting 方法来解决这个问题,以在产品实际被删除之前删除所有引用。
ORM 层的 Intershop 食谱说明:
“实例必须为给定的 ORM 对象类型实现接口 ORMObjectListener 并在工厂注册。在创建、更改或删除给定类型的实例时调用侦听器。”
但是,我们在工厂找不到用于注册侦听器的食谱。我们需要做什么来注册监听器?
此外,如果在删除事件期间有更好的方法来处理我们自定义对象上的系统对象的依赖关系,我愿意接受建议。
更新:
这是我到目前为止尝试过的监听器类:
public class ProductDeleteListener implements ORMObjectListener<ProductPO> {
@Inject
ProductPOFactory productPOFactory;
/** The Constant LOGGER. */
private static final Logger LOGGER = LoggerFactory.getLogger(ProductDeleteListener.class);
public ProductDeleteListener() {
productPOFactory.addObjectListener(this, new AttributeDescription[0]);
}
@Override
public boolean isOldStateNeeded() {
// TODO Auto-generated method stub
return false;
}
@Override
public void objectChanged(ProductPO object, Map<AttributeDescription, Object> previousValues) {
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("PRODUCT LISTENER TEST - CHANGE");
}
}
@Override
public void objectChanging(ProductPO object, Map<AttributeDescription, Object> previousValues) {
// TODO Auto-generated method stub
}
@Override
public void objectCreated(ProductPO object) {
// TODO Auto-generated method stub
}
@Override
public void objectCreating(ProductPO object) {
// TODO Auto-generated method stub
}
@Override
public void objectDeleted(ORMObjectKey objectKey) {
// TODO Auto-generated method stub
}
@Override
public void objectDeleting(ProductPO object) {
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("PRODUCT LISTENER TEST - PRE DELETE");
}
}
}
但它不起作用。当对象更改或被删除时,不会记录任何内容。