热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

在客户现场进行技术验证的时候,客户需要将预定义主从实体的数据复制到正式主从实体中,并进行持久化将正式数据保存到正式表中。考虑到EOS开发平台中ÿ

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

数据集

  在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 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 subObject = (List) 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 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 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 对象中。


推荐阅读
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • 本文详细介绍了 com.apollographql.apollo.api.internal.Optional 类中的 orNull() 方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 原文网址:https:www.cnblogs.comysoceanp7476379.html目录1、AOP什么?2、需求3、解决办法1:使用静态代理4 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • Java 中的等时日期(int,int)方法,示例 ... [详细]
  • Java设计模式详解:解释器模式的应用与实现
    本文详细介绍了Java设计模式中的解释器模式,包括其定义、应用场景、优缺点以及具体的实现示例。通过音乐解释器的例子,帮助读者更好地理解和应用这一模式。 ... [详细]
  • 本文介绍了如何在 Spring Boot 项目中使用 spring-boot-starter-quartz 组件实现定时任务,并将 cron 表达式存储在数据库中,以便动态调整任务执行频率。 ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • JVM钩子函数的应用场景详解
    本文详细介绍了JVM钩子函数的多种应用场景,包括正常关闭、异常关闭和强制关闭。通过具体示例和代码演示,帮助读者更好地理解和应用这一机制。适合对Java编程和JVM有一定基础的开发者阅读。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
author-avatar
快活林2007
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有