/* ================================================================== * Created [2009-4-27 下午11:32:55] by Jon.King * ================================================================== * TSS * ================================================================== * mailTo:jinpujun@hotmail.com * Copyright (c) Jon.King, 2009-2012 * ================================================================== */ package com.jinhe.tss.component.dynproperty.support.hibernate; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import com.jinhe.tss.component.dynproperty.entity.PropertyDef; import com.jinhe.tss.component.dynproperty.entity.PropertyEntry; import com.jinhe.tss.component.dynproperty.support.AbstractDynEntity; import com.jinhe.tss.component.dynproperty.support.DynProperty; import com.jinhe.tss.core.persistence.IDao; import com.jinhe.tss.core.persistence.IEntity; import com.jinhe.tss.core.util.DateUtil; /** * <p> HibernateDynProperty.java </p> * * 用hibernate方式实现处理动态属性值。 * * @author Jon.King 2008/04/14 10:18:47 $ */ public class HibernateDynProperty implements DynProperty{ private IDao<IEntity> dao; public void init(IDao<IEntity> dao) { this.dao = dao; // 注入一个DAO } /** * 获取某个实体的所有(动态属性) * @param entityCode * @return */ @SuppressWarnings("unchecked") private List<PropertyDef> getDynProperties(String entityCode) { String hql = "from PropertyDef o where o.entityCode = ? and o.isdyn = 1"; return (List<PropertyDef>) dao.getEntities(hql, entityCode); } /** * 根据动态属性所对应的自定义属性ProPertyDef的ID以及其所属对象的ID * @param entityID * 所属对象的ID * @param defID * 所对应的自定义属性ProPertyDef的ID */ @SuppressWarnings("unchecked") private List<PropertyEntry> getDynPropertyValues(Long entityId, Long defId) { String hql = "from PropertyEntry o where o.entityId = ? and o.defId = ? "; return (List<PropertyEntry>) dao.getEntities(hql, entityId, defId); } /** * 保存动态属性值到动态属性值表中。 * @param entityID * 所属对象的ID * @param defID * 所对应的自定义属性ProPertyDef的ID * @param type * 新增属性值的类型 * @param value * 新增属性的值 */ private void saveDynPropertyValue(Long entityId, Long defId, int type, Object value) { if( value == null || "".equals(value.toString()) ){ return; } PropertyEntry entry = new PropertyEntry(); entry.setEntityId(entityId); entry.setDefId(defId); entry.setValue(type, value); //如果entry中各个类型的值都为空,则不保存 if(entry.isVauleNull()) return; dao.create(entry); } /** * 移除某个实体下某个动态属性的所有动态属性值 * @param entityID * @param defId */ private void removeEntry(Long entityId, Long defId){ List<PropertyEntry> data = getDynPropertyValues(entityId, defId); for(PropertyEntry temp : data) { dao.delete(temp); } } @Override public AbstractDynEntity saveDynProperti4Entity(AbstractDynEntity entity) { List<PropertyDef> dynproperties = this.getDynProperties(entity.getEntityCode()); Map<String, PropertyDef> keyMappingPropertyDef = new HashMap<String, PropertyDef>(); for(PropertyDef property : dynproperties ){ keyMappingPropertyDef.put(property.getKey(), property); this.removeEntry(entity.getId(), property.getId()); //保存动态属性前先移除原先的动态属性值 } Map<String, Object> dynpropertiesMap = entity.getDynpropertiesMap(); for(String key : dynpropertiesMap.keySet()){ PropertyDef property = keyMappingPropertyDef.get(key); //如果map中的值动态属性列中没有,则跳过 if(property == null) continue; Object value = dynpropertiesMap.get(key); if(value instanceof Object[]){ // 多值 Object[] objs = (Object[]) value; for(int i = 0; i < objs.length; i++){ this.saveDynPropertyValue(entity.getId(), property.getId(), Integer.parseInt(property.getType()), objs[i]); } }else{ this.saveDynPropertyValue(entity.getId(), property.getId(), Integer.parseInt(property.getType()), value); } } return entity; } @Override public AbstractDynEntity getDynProperti4Entity(AbstractDynEntity entity) { List<PropertyDef> dynproperties = this.getDynProperties(entity.getEntityCode()); //取出对象的所有动态属性 for(PropertyDef property : dynproperties){ List<PropertyEntry> values = this.getDynPropertyValues(entity.getId(), property.getId()); //取出对象当前记录的所有动态属性值 List<Object> list = new ArrayList<Object>(); for(PropertyEntry entry : values){ Object value = entry.getValue(Integer.parseInt(property.getType())); if(value == null) continue; if(value instanceof Date){ value = DateUtil.format((Date)value); } list.add(value); } entity.getDynpropertiesMap().put(property.getKey(), list.toArray()); } return entity; } @Override public void removeDynProperti4Entity(AbstractDynEntity entity) { List<PropertyDef> dynproperties = this.getDynProperties(entity.getEntityCode()); for( PropertyDef property : dynproperties ){ this.removeEntry(entity.getId(), property.getId()); } } }