如何在liferay服务xml文件中实现参照完整性和级联操作?

时间:2015-06-25 10:33:39

标签: liferay liferay-6

我要求我需要使用liferay服务构建器实现onDelete Cascade功能。我如何在liferay中实现这一目标?

1 个答案:

答案 0 :(得分:3)

首先:

onDelete Cascade不是Liferay Service Builder功能。它是您的数据库提供的功能。

下一步: Liferay的前提是,所有数据处理和评估都应该在代码中完成,而不是在数据库中完成。

说完了:

与onDelete Cascade类似的东西是实现模型侦听器。 ModelListener正在侦听模型的更改。 (我知道,误导名称;))在这个模型监听器中,你将实现onAfterRemove。在onAfterRemove中输入您的代码以删除相关记录。

这是我写的一个小样本。代码正在侦听组对象的更改,并尝试删除引用的ObjectGeodata对象(如果存在)。

package de.osc.geodata.modellistener;

import com.liferay.portal.ModelListenerException;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.search.IndexerRegistryUtil;
import com.liferay.portal.kernel.search.SearchException;
import com.liferay.portal.model.BaseModelListener;
import com.liferay.portal.model.Group;
import com.liferay.portal.service.ServiceContext;

import de.osc.geodata.model.ObjectGeodata;
import de.osc.geodata.service.ObjectGeodataLocalServiceUtil;

public class GroupModelListener extends BaseModelListener<Group> {

    private static final Log log = LogFactoryUtil.getLog(GroupModelListener.class);


    @Override
    public void onAfterRemove(Group model) throws ModelListenerException {
        try {
            ObjectGeodata objectGeodata = ObjectGeodataLocalServiceUtil.getObjectGeodata(model.getClassNameId(), model.getClassPK());
            if (objectGeodata != null) {
                ObjectGeodataLocalServiceUtil.deleteObjectGeodata(objectGeodata);
            }
        } catch (SystemException e) {
            log.warn("No GeodataObject found in Index.", e);
        }

        super.onAfterRemove(model);
    }

}