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

本文介绍了一种基于元数据的实体持久化框架,支持主子表、多子表和复杂VO结构的保存和删除操作。通过NCObject处理业务实体,实现数据的存储和查询,包括按条件查询、按PK查询及批量操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值