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

简介:  在客户现场进行技术验证的时候,客户需要将预定义主从实体的数据复制到正式主从实体中,并进行持久化将正式数据保存到正式表中。考虑到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 对象中。


目录
相关文章
|
数据库
主题域、概念、逻辑、物理四种模型有什么区别与联系?
主题域、概念、逻辑、物理四种模型有什么区别与联系?
|
5月前
|
存储 SQL NoSQL
仓储设计实现问题之在仓储实体转移模式下处理聚合实体的删除如何解决
仓储设计实现问题之在仓储实体转移模式下处理聚合实体的删除如何解决
|
6月前
|
存储 JSON 数据库
项目管理定义问题之什么是序列化大对象的值对象数据库形态
项目管理定义问题之什么是序列化大对象的值对象数据库形态
|
7月前
|
SQL 数据库 数据库管理
数据库关系运算理论:关系数据操作与关系完整性概念解析
数据库关系运算理论:关系数据操作与关系完整性概念解析
147 0
|
数据库
4.4关系配置
关系配置
159 0
|
关系型数据库 MySQL 数据库
数据库技术知识点(一)IDEFO需求建模方法、解释实体、实体型、实体集的区别、完全函数依赖、部分函数依赖、传递函数、平凡函数依赖、非平凡函数依赖举例、超码、主码、候选码的概念与区分
数据库技术知识点(一)IDEFO需求建模方法、解释实体、实体型、实体集的区别、完全函数依赖、部分函数依赖、传递函数、平凡函数依赖、非平凡函数依赖举例、超码、主码、候选码的概念与区分
数据库技术知识点(一)IDEFO需求建模方法、解释实体、实体型、实体集的区别、完全函数依赖、部分函数依赖、传递函数、平凡函数依赖、非平凡函数依赖举例、超码、主码、候选码的概念与区分
|
数据库 缓存 索引
关系数据库设计中,用中间表好还是直接设定主外键关联好?
有人会对数据库有这样的疑问: 因为大多数的数据库教程上都是告诉你关系数据库如何去创建1:1、1:N和N:M的数据库关系,但我发现很多开源产品中,并没有直接使用关系数据库的关系查询、关系删除等功能,而是直接在代码中对多个表的查询结果进行组合。
2475 0
|
SQL Java 数据库连接
Hibernate的三种状态及相互转化
Hibernate的三种状态及相互转化
268 0
Hibernate的三种状态及相互转化
带你读《实分析(原书第4版)》之一:集合、映射与关系的预备知识
本书是一部实分析方面的经典教材,主要分三部分,第壹部分为经典的实变函数论和经典的巴拿赫空间理论;第二部分为抽象空间理论,主要介绍分析中有用的拓扑空间以及近代巴拿赫空间理论;第三部分为一般的测度和积分论,即在第二部分理论基础上将经典的测度、积分论推广到一般情形。
级联复制转化成一主两从
1.如图,级联复制如果转化成一主两从? GTID复制处理方法: 只需要把S2的复制停掉,然后重新change到M上即可; S2: stop slave; reset slave all; change master to M; start slave 传统复制处理方法(...
1133 0

热门文章

最新文章