[英]How to register ORMObjectListener in Intershop7
我們已經在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");
}
}
}
但這是行不通的。 對象更改或刪除時,不會記錄任何內容。
除了Willem Evertse編寫的內容外,您還需要將注冊代碼放在通過Intershop Component Framework實例化的類中。
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所述的注冊調用。 至於停止方法,您需要安全地注銷您的對象偵聽器。 確保兩個方法都聲明為同步。
我認為注冊聽眾是正確的方法。 也許只是尋找性能問題。
沒錯,這里沒有示例,但這是一個示例。 獲取要從中接收消息的工廠。 您的情況是ProductPOFactory
ProductPOFactory productFactory = (ProductPOFactory) NamingMgr.getInstance().lookupFactory(ProductPO.class);
productFactory.addObjectListener(new MyProductChangeListener());
MyProductChangeListener
需要擴展AbstractORMObjectListener<ProductPO>
並實現方法public void objectDeleting(T object)
每次刪除產品時,都應調用您的偵聽器,然后您可以清理您的自定義orm對象。 您可以看一下ImageSetDefinitionPOListener
作為示例
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.