将主从实体数据转化为目标主从实体数据

简介:  在客户现场进行技术验证的时候,客户需要将预定义主从实体的数据复制到正式主从实体中,并进行持久化将正式数据保存到正式表中。考虑到EOS开发平台中,可以借助 Hibernate 关联操作(插入、更新)数据集中主从表数据,只需要解决如何将预定义实体的数据转移到正式实体中。实体关系如下图所示

在客户现场进行技术验证的时候,客户需要将预定义主从实体的数据复制到正式主从实体中,并进行持久化将正式数据保存到正式表中。考虑到EOS开发平台中,可以借助 Hibernate 关联操作(插入、更新)数据集中主从表数据,只需要解决如何将预定义实体的数据转移到正式实体中。实体关系如下图所示:



image.png

 在EOS中的 com.eos.foundation 构件库中存在com.eos.foundation.data.DataObjectUtil.convertDataObject 方法,可以将单层的数据进行转换。通过分析,数据集的定义不能确定如何关联从表的引用,所以需要明确定义从表的引用名称需要相同(如上图红色方框)。另外,在数据集定义的时候,未明确定义 1:1 关系的引用,所以在这里明确修改 1:1 引用名为 targetHead。


 下面附上代码的简单实现:


package com.primeton.eos.foundationX;
import java.util.List;
import com.eos.foundation.ExceptionConstant;
import com.eos.foundation.common.utils.StringUtil;
import com.eos.foundation.data.DataObjectUtil;
import com.eos.system.annotation.Bizlet;
import com.eos.system.exception.EOSRuntimeException;
import com.primeton.data.sdo.impl.TypeReference;
import com.primeton.ext.data.sdo.DataUtil;
import commonj.sdo.DataObject;
import commonj.sdo.Property;
/**
 * @author Flying Rat
 * @date 2015-01-13 10:59:42
 */
@Bizlet("数据对象操作扩展")
public class DataObjectUtilX {
    @Bizlet("为数据对象指定属性填充数据")
    public static DataObject setProperty(DataObject dataObject, String key, String value) {
        if (dataObject == null) {
            return null;
        }
        if (StringUtil.isBlank(key)) {
            throw new EOSRuntimeException(ExceptionConstant.PARAM_IS_BLANK, new String[] { "key:" + key });
        }
        dataObject.set(key, value);
        return dataObject;
    }
    @Bizlet("为数据对象指定属性填充数据,深层填充。")
    public static DataObject setProperty(DataObject dataObject, String key, Object value, boolean recursion) {
        if (dataObject == null) {
            return null;
        }
        if (StringUtil.isBlank(key)) {
            throw new EOSRuntimeException(ExceptionConstant.PARAM_IS_BLANK, new String[] { "key:" + key });
        }
        dataObject.set(key, value);
        @SuppressWarnings("unchecked")
        List<Property> list = dataObject.getInstanceProperties();
        for (Property prop : list) {
            if (dataObject.isSet(prop)) {// 如果该属性可配置
                if (prop.getName().equals(key)) {
                    if (prop.getType().isDataType()) {
                        dataObject.set(key, DataUtil.toSDOValue(prop.getType(), value));
                    } else {
                        dataObject.set(key, value);
                    }
                } else if (recursion && !prop.getType().isDataType()) {
                    @SuppressWarnings("unchecked")
                    List<DataObject> subObject = (List<DataObject>) dataObject.get(prop);
                    for (DataObject o : subObject) {
                        DataObjectUtilX.setProperty(o, key, value, recursion);
                    }
                }
            }
        }
        return dataObject;
    }
    @Bizlet("将DataObject转化为目标实体类型的DataObject,深层转化。")
    public static DataObject convertDataObject(DataObject srcDataObject) {
        if (srcDataObject == null) {
            return null;
        }
        String targetEntityName = null;
        @SuppressWarnings("unchecked")
        List<Property> list = srcDataObject.getInstanceProperties();
        for (Property srcProp : list) {
            if (srcDataObject.isSet(srcProp)) {// 如果该属性可配置
                String propertyName = srcProp.getName();// 获取该属性名
                if ("targetHead".equals(propertyName)) {
                    targetEntityName = ((TypeReference) srcProp.getType()).getEntityName();
                }
            }
        }
        if (StringUtil.isBlank(targetEntityName)) {
            throw new EOSRuntimeException(ExceptionConstant.PARAM_IS_BLANK, new String[] { "targetEntityName" });
        }
        DataObject targetDataObject = DataObjectUtil.createDataObject(targetEntityName);
        for (Property srcProp : list) {
            if (srcDataObject.isSet(srcProp)) {// 如果该属性可配置
                Object value = srcDataObject.get(srcProp);// 获取该属性值
                String propertyName = srcProp.getName();// 获取该属性名
                if (srcProp.getType().isDataType()) {
                    Property targetProp = targetDataObject.getInstanceProperty(propertyName);// 实例化目标对象的该属性
                    if (null != targetProp) {// 如果目标对象存在该属性
                        if (targetProp.getType().isDataType()) {
                            targetDataObject.set(propertyName, DataUtil.toSDOValue(targetProp.getType(), value));
                        } else {
                            targetDataObject.set(propertyName, value);
                        }
                    } else if (targetDataObject.getType().isOpen()) {
                        targetDataObject.set(propertyName, value);
                    }
                } else {
                    String propName = srcProp.getName();
                    Property targetProp = targetDataObject.getInstanceProperty(propName);
                    if (null != targetProp) {// 如果目标对象存在该属性
                        if (srcProp.isMany()) {
                            DataObject[] d = DataObjectUtil.convertDataObjects(value, ((TypeReference) targetProp.getType()).getEntityName(), true);
                            targetDataObject.set(propName, d);
                        } else {
                            DataObject d = DataObjectUtil.convertDataObject((DataObject) value, ((TypeReference) targetProp.getType()).getEntityName(), true);
                            targetDataObject.set(propName, d);
                        }
                    }
                }
            }
        }
        return targetDataObject;
    }
    @Bizlet("将DataObject转化为目标实体类型的DataObject,深层转化。")
    public static DataObject convertDataObject(DataObject srcDataObject, String targetEntityName) {
        if (srcDataObject == null) {
            return null;
        }
        if (StringUtil.isBlank(targetEntityName)) {
            throw new EOSRuntimeException(ExceptionConstant.PARAM_IS_BLANK, new String[] { "targetEntityName" });
        }
        DataObject targetDataObject = DataObjectUtil.createDataObject(targetEntityName);
        @SuppressWarnings("unchecked")
        List<Property> list = srcDataObject.getInstanceProperties();
        for (Property srcProp : list) {
            if (srcDataObject.isSet(srcProp)) {// 如果该属性可配置
                Object value = srcDataObject.get(srcProp);// 获取该属性值
                String propertyName = srcProp.getName();// 获取该属性名
                if (srcProp.getType().isDataType()) {
                    Property targetProp = targetDataObject.getInstanceProperty(propertyName);// 实例化目标对象的该属性
                    if (null != targetProp) {// 如果目标对象存在该属性
                        if (targetProp.getType().isDataType()) {
                            targetDataObject.set(propertyName, DataUtil .toSDOValue(targetProp.getType(), value));
                        } else {
                            targetDataObject.set(propertyName, value);
                        }
                    } else if (targetDataObject.getType().isOpen()) {
                        targetDataObject.set(propertyName, value);
                    }
                } else {
                    String propName = srcProp.getName();
                    Property targetProp = targetDataObject.getInstanceProperty(propName);
                    if (null != targetProp) {// 如果目标对象存在该属性
                        if (srcProp.isMany()) {
                            DataObject[] d = DataObjectUtil.convertDataObjects(value, ((TypeReference) targetProp.getType()).getEntityName(), true);
                            targetDataObject.set(propName, d);
                        } else {
                            DataObject d = DataObjectUtil.convertDataObject((DataObject) value, ((TypeReference) targetProp.getType()).getEntityName(), true);
                            targetDataObject.set(propName, d);
                        }
                    }
                }
            }
        }
        return targetDataObject;
    }
}

 在上面的 DataObjectUtilX 工具类中,setProperty 方法是为 DataObject 对象赋值,convertDataObject 方法是 DataObject 数据复制到目标 DataObject 对象中。


目录
相关文章
|
11月前
|
数据库
主题域、概念、逻辑、物理四种模型有什么区别与联系?
主题域、概念、逻辑、物理四种模型有什么区别与联系?
|
29天前
|
SQL 数据库 数据库管理
数据库关系运算理论:关系数据操作与关系完整性概念解析
数据库关系运算理论:关系数据操作与关系完整性概念解析
28 0
|
2月前
|
存储 SQL NoSQL
数据库的介绍、分类、作用和特点
数据库的介绍、分类、作用和特点
39 1
|
2月前
|
存储 NoSQL 关系型数据库
数据库的分类,作用以及特点介绍
数据库是按照数据结构来组织、存储和管理数据的仓库。
63 0
|
Oracle 关系型数据库 数据库
使用日志传输的方法在两个数据库之间同步数据
源 oracle18:oracle18c-standby 192.168.17.26 目标 oracle18-2:oracle18c-primary 192.168.17.109
120 0
|
关系型数据库 MySQL 数据库
数据库技术知识点(一)IDEFO需求建模方法、解释实体、实体型、实体集的区别、完全函数依赖、部分函数依赖、传递函数、平凡函数依赖、非平凡函数依赖举例、超码、主码、候选码的概念与区分
数据库技术知识点(一)IDEFO需求建模方法、解释实体、实体型、实体集的区别、完全函数依赖、部分函数依赖、传递函数、平凡函数依赖、非平凡函数依赖举例、超码、主码、候选码的概念与区分
数据库技术知识点(一)IDEFO需求建模方法、解释实体、实体型、实体集的区别、完全函数依赖、部分函数依赖、传递函数、平凡函数依赖、非平凡函数依赖举例、超码、主码、候选码的概念与区分
|
SQL Java 数据库连接
Hibernate的三种状态及相互转化
Hibernate的三种状态及相互转化
236 0
Hibernate的三种状态及相互转化
级联复制转化成一主两从
1.如图,级联复制如果转化成一主两从? GTID复制处理方法: 只需要把S2的复制停掉,然后重新change到M上即可; S2: stop slave; reset slave all; change master to M; start slave 传统复制处理方法(...
1111 0
|
前端开发 JavaScript .NET
【自然框架】 之 主从表的添加、修改
摘要 1、 这里不是说如何做一个人员管理,这里要说的是自然框架如何处理主从表的添加、修改。人员管理只是一个例子。2、 人员管理的表的“结构”。3、 Tab标签页,通过js脚本+iframe实现的Tab效果。
1478 0
|
存储
数据存储类型之间的转换总结
一、char转 TCHAR char a[124]; TCHAR b[124]; MultiByteToWideChar(CP_ACP, 0, a, -1, b, 128); 二、TCHAR 转string TC...
994 0

热门文章

最新文章