首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Intershop7中注册ORMObjectListener

如何在Intershop7中注册ORMObjectListener
EN

Stack Overflow用户
提问于 2018-07-25 18:11:07
回答 2查看 113关注 0票数 2

我们在我们的webshop实现中实现了几个自定义ORM对象,它们具有对Intershop Product系统对象的引用(依赖项)。

当用户试图在后台删除某个产品时,这会导致问题,因为在我们的自定义对象中可能仍然存在对该产品的引用。当然,删除从我们的一个自定义对象中引用的产品会产生如下异常:

代码语言:javascript
复制
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,并在工厂注册。当创建、更改或删除给定类型的实例时,将调用侦听器。

(https://support.intershop.com/kb/index.php/Display/2G3270#Cookbook-ORMLayer-Recipe:NotificationofPersistentObjectChanges)

但是,我们找不到用于在工厂注册监听器的食谱。我们需要做什么来注册监听程序?

此外,如果在删除事件期间有更好的方法来处理系统对象对自定义对象的依赖关系,我愿意接受建议。

更新:

这是我到目前为止尝试过的listener类:

代码语言:javascript
复制
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");
    }

  }

}

但它不起作用。当对象更改或删除时,不会记录任何内容。

EN

回答 2

Stack Overflow用户

发布于 2018-07-25 21:57:02

除了Willem Evertse写的东西之外,你还需要把你的注册代码放在一个通过Intershop组件框架实例化的类中。

implementation.component:

代码语言:javascript
复制
<components xmlns="http://www.intershop.de/component/2010" scope="global">
<implementation name="ProductDeleteListenerRegistrar"
    class="your.fullqualifed.ProductDeleteRegistrar" start="start" stop="stop"></implementation>

instances.component:

代码语言:javascript
复制
<components xmlns="http://www.intershop.de/component/2010"> <instance name="ORMValidator" with="ORMValidator" scope="global"/></components>

你需要编写一个类,例如ProductDeleteRegistrar,并提供start方法,在其中你可以像Willem描述的那样添加注册调用。至于stop方法,您需要安全地注销您的对象侦听器。确保两个方法都声明为同步。

票数 3
EN

Stack Overflow用户

发布于 2018-07-25 19:19:20

我认为注册一个监听将是正确的方法。也许只需要注意性能问题。

你说得对,没有这样的例子,但这里有一个例子。获取要从其接收消息的工厂。在您的示例中,它是ProductPOFactory

代码语言:javascript
复制
ProductPOFactory productFactory = (ProductPOFactory) NamingMgr.getInstance().lookupFactory(ProductPO.class);
productFactory.addObjectListener(new MyProductChangeListener());

MyProductChangeListener需要扩展AbstractORMObjectListener<ProductPO>并实现public void objectDeleting(T object)方法

每次产品被删除时,你的监听器都会被调用,然后你可以清理你的定制orm对象。您可以以ImageSetDefinitionPOListener为例进行查看

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51516296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档