NC6 基于元数据的BaseDAO 支持以下形式实体的持久化 1. 主子表 2. 多子表 3. 主子子表,内部嵌套的VO结构

    技术2022-07-11  103

    package nc.md.persist.framework.imp; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import nc.bs.logging.Logger; import nc.bs.ml.NCLangResOnserver; import nc.md.data.access.NCObject; import nc.md.data.criterion.QueryCondition; import nc.md.model.IBusinessEntity; import nc.md.model.MetaDataException; import nc.vo.pub.AggregatedValueObject; import nc.vo.pub.BusinessException; import nc.vo.pub.CircularlyAccessibleValueObject; import nc.vo.pub.SuperVO; /** * 基于元数据的BaseDAO 支持以下形式实体的持久化 1. 主子表 2. 多子表 3. 主子子表,内部嵌套的VO结构 * */ public class MDBaseDAO { /** * 保存SuperVO对象 * @param billVo * @throws MetaDataException */ public String saveBill(Object billVo, boolean deleteDrEqualOneFromDB) throws MetaDataException { checkBillVO(billVo); NCObject ncObj = MDPersistUtil.getNCObject(billVo); return saveBill(new NCObject[] { ncObj }, deleteDrEqualOneFromDB)[0]; } /** * handle the NCObject,save or delete the data * @param ncObjs the ncobject to handled * @param bDelete is deleted * @param deleteFromDB delete the data from the database * @return the key of the data to handled * @throws MetaDataException * @author wangxmn */ String[] handleBill(NCObject[] ncObjs, boolean bDelete, boolean deleteFromDB) throws MetaDataException{ if (ncObjs == null || ncObjs.length == 0) throw new MetaDataException(NCLangResOnserver.getInstance().getStrByID("mdbusi", "mdBaseDAO-0001")/*The VO Array to be saved is null,can not to be saved!!*/); VOPersister persister = new VOPersister((IBusinessEntity) ncObjs[0].getRelatedBean()); return persister.saveVOS(ncObjs, bDelete, deleteFromDB); } /** * 保存SuperVO对象 * @param billVo * @throws MetaDataException */ String[] handleBill(CircularlyAccessibleValueObject[] billVos, boolean isDeleted, boolean deleteDrEqualOneFromDB) throws MetaDataException { if (billVos == null || billVos.length == 0) throw new MetaDataException(NCLangResOnserver.getInstance().getStrByID("mdbusi", "mdBaseDAO-0000")/*The VO Array to be saved is null,can not to be saved!*/); checkBillVO(billVos[0]); NCObject[] ncObjs = MDPersistUtil.getNCObject(billVos); return handleBill(ncObjs,isDeleted,deleteDrEqualOneFromDB); } /** * 保存SuperVO对象 * @param billVo * @throws MetaDataException */ public String[] saveBill(CircularlyAccessibleValueObject[] billVos, boolean deleteDrEqualOneFromDB) throws MetaDataException { if (billVos == null || billVos.length == 0) throw new MetaDataException(NCLangResOnserver.getInstance().getStrByID("mdbusi", "mdBaseDAO-0000")/*The VO Array to be saved is null,can not to be saved!*/); checkBillVO(billVos[0]); NCObject[] ncObjs = MDPersistUtil.getNCObject(billVos); return saveBill(ncObjs, deleteDrEqualOneFromDB); } /** * 保存NCObject[]对象 * @param ncObjs * @return * @throws MetaDataException */ public String[] saveBill(NCObject[] ncObjs, boolean deleteDrEqualOneFromDB) throws MetaDataException { return handleBill(ncObjs,false,deleteDrEqualOneFromDB); } /** * 删除单据 * @param billVo * @throws MetaDataException */ public void deleteBill(Object billVo) throws MetaDataException { checkBillVO(billVo); NCObject ncObj = MDPersistUtil.getNCObject(billVo); deleteBill(new NCObject[] { ncObj }); } /** * 删除NCObejct * @param billVo * @throws MetaDataException */ public void deleteBill(NCObject[] ncObjs) throws MetaDataException { handleBill(ncObjs,true,false); } /** * 从数据库删除(真删) * @param billVo * @throws MetaDataException */ public void deleteBillFromDB(Object billVo) throws MetaDataException { checkBillVO(billVo); NCObject ncObj = MDPersistUtil.getNCObject(billVo); deleteBillFromDB(new NCObject[] { ncObj }); } /** * 从数据库删除(真删) * @param billVos * @throws MetaDataException */ public void deleteBillFromDB(CircularlyAccessibleValueObject[] billVos) throws MetaDataException { if (billVos == null || billVos.length == 0) throw new MetaDataException(NCLangResOnserver.getInstance().getStrByID("mdbusi", "mdBaseDAO-0002")/*The VO Array to be deleted is null,can not to be saved!*/); NCObject[] ncObjs = MDPersistUtil.getNCObject(billVos); VOPersister persister = new VOPersister((IBusinessEntity) ncObjs[0].getRelatedBean()); persister.deleteVOS(ncObjs); } /** * 从数据库删除(真删) * @param billVos * @throws MetaDataException */ public void deleteBillFromDB(NCObject[] billVos) throws MetaDataException { if (billVos == null || billVos.length == 0) throw new MetaDataException(NCLangResOnserver.getInstance().getStrByID("mdbusi", "mdBaseDAO-0003")/*The VO Array to be deleted is null,can not to be saved!!*/); VOPersister persister = new VOPersister((IBusinessEntity) billVos[0].getRelatedBean()); persister.deleteVOS(billVos); } private void checkBillVO(Object billVo) throws MetaDataException { if (billVo == null) throw new MetaDataException(NCLangResOnserver.getInstance().getStrByID("mdbusi", "mdBaseDAO-0001")/*The VO Array to be saved is null,can not to be saved!!*/); if (billVo instanceof AggregatedValueObject) { if (((AggregatedValueObject) billVo).getParentVO() == null) throw new MetaDataException(NCLangResOnserver.getInstance().getStrByID("mdbusi", "mdBaseDAO-0004")/*The AGGVO Array to be saved is null,can not to be saved!*/); } } /** * 根据PK查询单据,返回NCObject * @param voClass * @param billPK * @return * @throws MetaDataException */ public NCObject queryBillOfNCObjectByPK(Class voClass, String billPK, boolean ignoreDrEqual1) throws MetaDataException { return new VOQueryPersister(voClass.getName(), ignoreDrEqual1).queryBillImp(billPK, false); } public NCObject[] queryBillOfNCObjectByPKs(Class voClass, String[] billPKs, String[] filtAttrNames, boolean bLazyLoad) throws MetaDataException { return new VOQueryPersister(voClass.getName()).queryBillsImp(billPKs, filtAttrNames, bLazyLoad); } /** * @param voClass 主子表VO传主表VO类,一般VO直接传VO类 * @param whereCondStr * @return */ public NCObject[] queryBillOfNCObjectByCond(Class voClass, String whereCondStr, boolean bLazyLoad, String[] orderPaths) throws MetaDataException { return new VOQueryPersister(voClass.getName()).queryBillsImp(whereCondStr, bLazyLoad, orderPaths); } /** * 根据where条件查询单据,返回实际的VO集合(List),请注意此处使用的where子句为正常的sql语法,不是面向模型的 * @param voClass * @param whereCondStr * @param ignoreDrEqual1 是否忽略dr为1的记录,针对NC的特殊性设置,默认为false * @param bLazyLoad 是否懒加载 * @return * @throws MetaDataException */ public Collection queryBillOfVOByCond(Class voClass, String whereCondStr, boolean ignoreDrEqual1, boolean bLazyLoad, String[] orderPaths) throws MetaDataException { NCObject[] ncObjs = new VOQueryPersister(voClass.getName(), ignoreDrEqual1).queryBillsImp( whereCondStr, bLazyLoad, orderPaths); List resList = new ArrayList(); if (ncObjs != null) { for (int i = 0; i < ncObjs.length; i++) { resList.add(ncObjs[i].getContainmentObject()); } } return resList; } public <E> Collection<E> queryBillOfVOByCond(Class<E> voClass, String[] tableNames, String whereCondStr, boolean ignoreDrEqual1, boolean lazyLoad, String[] orderPaths) throws MetaDataException { NCObject[] ncObjs = new VOQueryPersister(voClass.getName(), ignoreDrEqual1).queryBillsImp( tableNames, whereCondStr, lazyLoad, orderPaths); List<E> resList = new ArrayList<E>(); if (ncObjs != null) { for (int i = 0; i < ncObjs.length; i++) { Object obj = ncObjs[i].getContainmentObject(); if (voClass.isInstance(obj)) { resList.add(voClass.cast(ncObjs[i].getContainmentObject())); } } } return resList; } public <E> Collection<E> queryBillOfVOByFromAndCond(Class<E> voClass, String fromSql, String whereCondStr, boolean lazyLoad, String[] orderPaths) throws MetaDataException { NCObject[] ncObjs = new VOQueryPersister(voClass.getName()).queryBillsImp(fromSql, whereCondStr, lazyLoad, orderPaths); List<E> resList = new ArrayList<E>(); if (ncObjs != null) { for (int i = 0; i < ncObjs.length; i++) { Object obj = ncObjs[i].getContainmentObject(); if (voClass.isInstance(obj)) { resList.add(voClass.cast(ncObjs[i].getContainmentObject())); } } } return resList; } public Collection queryBillOfVOByCond(Class voClass, String whereCondStr, boolean ignoreDrEqual1, String[] subEntityPaths, String[] orderPaths) throws MetaDataException { NCObject[] ncObjs = new VOQueryPersister(voClass.getName(), ignoreDrEqual1).queryBillsImp( whereCondStr, subEntityPaths, orderPaths); List resList = new ArrayList(); if (ncObjs != null) { for (int i = 0; i < ncObjs.length; i++) { resList.add(ncObjs[i].getContainmentObject()); } } return resList; } public NCObject[] queryBillOfVOByCond(Class voClass, String whereCondStr, String[] filtAttrNames, boolean ignoreDrEqual1, boolean bLazyLoad) throws MetaDataException { return new VOQueryPersister(voClass.getName(), ignoreDrEqual1).queryBillsImp(whereCondStr, filtAttrNames, bLazyLoad); } /** * 提供面向模型的查询 * @param session * @param bLazyLoad * @return * @throws MetaDataException */ public Collection queryBillOfVOByCond(QueryCondition condition, boolean bLazyLoad, String[] orderPaths) throws MetaDataException { // Collection pks = DASFacade.queryPrimaryKeyByCriteriaReturnRowSet(condition.getQuerysession()); // if(pks==null) return new ArrayList(); // return queryBillOfVOByPKs(condition.getBeanClass(), (String[])pks.toArray(new String[0]), bLazyLoad); List<String> sqls = condition.getQuerysession().getGeneratedSQL(); if (sqls == null || sqls.size() != 1) throw new MetaDataException( NCLangResOnserver.getInstance().getStrByID("mdbusi", "mdBaseDAO-0005")/*the defination of query condition is Error ,can not create sql!conditon:*/ + condition.toString()); String keyAttrName = ((IBusinessEntity) condition.getEntityBean()).getKeyAttribute().getName(); String strWhere = new StringBuffer(keyAttrName).append(" in (").append(sqls.get(0)).append(")") .toString(); return queryBillOfVOByCond(condition.getBeanClass(), strWhere, false, bLazyLoad, orderPaths); } /** * 根据PK查询单据,返回实际的VO * @param voClass * @param billPK * @return * @throws MetaDataException */ public Object queryBillOfVOByPK(Class voClass, String billPK, boolean bLazyLoad) throws MetaDataException { NCObject ncObj = new VOQueryPersister(voClass.getName()).queryBillImp(billPK, bLazyLoad); if (ncObj == null) return null; if (AggregatedValueObject.class.isAssignableFrom(voClass)) return ncObj.getContainmentObject(); else return ncObj.getModelConsistObject(); } public Collection queryBillOfVOByPKs(Class voClass, String[] billPKs, boolean bLazyLoad) throws MetaDataException { Collection<NCObject> col = new VOQueryPersister(voClass.getName()).queryBillsImp(billPKs, bLazyLoad); if (col == null || col.size() == 0) return null; Collection result = new ArrayList<Object>(); if (AggregatedValueObject.class.isAssignableFrom(voClass)) { //返回聚合VO for (NCObject ncObj : col) { result.add(ncObj.getContainmentObject()); } } else { //返回主表VO for (NCObject ncObj : col) { result.add(ncObj.getModelConsistObject()); } } return result; } public Object[] queryBillOfVOByPKsWithOrder(Class voClass, String[] billPKs, boolean bLazyLoad) throws MetaDataException { Collection<NCObject> col = new VOQueryPersister(voClass.getName()).queryBillsImp(billPKs, bLazyLoad); return getObjectWithorder(col, billPKs, voClass); } public Object[] queryBillOfVOByPKsWithOrder(Class voClass, String[] billPKs, String[] subEntityName) throws MetaDataException { Collection<NCObject> col = new VOQueryPersister(voClass.getName()).queryBillsImp(billPKs, subEntityName); return getObjectWithorder(col, billPKs, voClass); } private Object[] getObjectWithorder(Collection<NCObject> col, String[] billPKs, Class voClass) { if (col == null || col.size() == 0) return new Object[billPKs.length]; Object[] result = new Object[billPKs.length]; Map<String, Object> id_value_map = new HashMap<String, Object>(); if (AggregatedValueObject.class.isAssignableFrom(voClass)) { //聚合VO for (NCObject ncObj : col) { if (ncObj != null) { try { ((AggregatedValueObject) ncObj.getContainmentObject()).getParentVO().getPrimaryKey(); id_value_map.put(((AggregatedValueObject) ncObj.getContainmentObject()).getParentVO() .getPrimaryKey(), ncObj.getContainmentObject()); } catch (BusinessException e) { Logger.error("", e); } } } } else { //主表VO for (NCObject ncObj : col) { if (ncObj != null) { id_value_map.put(((SuperVO) ncObj.getModelConsistObject()).getPrimaryKey(), ncObj.getModelConsistObject()); } } } //排序 for (int i = 0; i < result.length; i++) { result[i] = id_value_map.get(billPKs[i]); } return result; } public void deleteBillByPK(Class voClass, String[] pks) throws MetaDataException { new VOPersister(voClass.getName()).deleteBillByPK(pks); } public void updateBillWithAttrs(NCObject[] billVos, String[] filtAttrNames) throws MetaDataException { if (billVos == null || billVos.length == 0) throw new MetaDataException(NCLangResOnserver.getInstance().getStrByID("mdbusi", "mdBaseDAO-0006")/*The VO Array to be updated is null,can not to be saved!*/); VOPersister persister = new VOPersister((IBusinessEntity) billVos[0].getRelatedBean()); persister.update(billVos, filtAttrNames); } }
    Processed: 0.012, SQL: 10