我们在我们的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 cookbook:
实例必须实现给定对象类型的接口ORMObjectListener,并在工厂注册。当创建、更改或删除给定类型的实例时,将调用侦听器。
但是,我们找不到用于在工厂注册监听器的食谱。我们需要做什么来注册监听程序?
此外,如果在删除事件期间有更好的方法来处理系统对象对自定义对象的依赖关系,我愿意接受建议。
更新:
这是我到目前为止尝试过的listener类:
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");
}
}
}但它不起作用。当对象更改或删除时,不会记录任何内容。
发布于 2018-07-25 21:57:02
除了Willem Evertse写的东西之外,你还需要把你的注册代码放在一个通过Intershop组件框架实例化的类中。
implementation.component:
<components xmlns="http://www.intershop.de/component/2010" scope="global">
<implementation name="ProductDeleteListenerRegistrar"
class="your.fullqualifed.ProductDeleteRegistrar" start="start" stop="stop"></implementation>
instances.component:
<components xmlns="http://www.intershop.de/component/2010"> <instance name="ORMValidator" with="ORMValidator" scope="global"/></components>你需要编写一个类,例如ProductDeleteRegistrar,并提供start方法,在其中你可以像Willem描述的那样添加注册调用。至于stop方法,您需要安全地注销您的对象侦听器。确保两个方法都声明为同步。
发布于 2018-07-25 19:19:20
我认为注册一个监听将是正确的方法。也许只需要注意性能问题。
你说得对,没有这样的例子,但这里有一个例子。获取要从其接收消息的工厂。在您的示例中,它是ProductPOFactory
ProductPOFactory productFactory = (ProductPOFactory) NamingMgr.getInstance().lookupFactory(ProductPO.class);
productFactory.addObjectListener(new MyProductChangeListener());MyProductChangeListener需要扩展AbstractORMObjectListener<ProductPO>并实现public void objectDeleting(T object)方法
每次产品被删除时,你的监听器都会被调用,然后你可以清理你的定制orm对象。您可以以ImageSetDefinitionPOListener为例进行查看
https://stackoverflow.com/questions/51516296
复制相似问题