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

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

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

数据集

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

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


  
  1. package com.primeton.eos.foundationX;
  2. import java.util.List;
  3. import com.eos.foundation.ExceptionConstant;
  4. import com.eos.foundation.common.utils.StringUtil;
  5. import com.eos.foundation.data.DataObjectUtil;
  6. import com.eos.system.annotation.Bizlet;
  7. import com.eos.system.exception.EOSRuntimeException;
  8. import com.primeton.data.sdo.impl.TypeReference;
  9. import com.primeton.ext.data.sdo.DataUtil;
  10. import commonj.sdo.DataObject;
  11. import commonj.sdo.Property;
  12. /**
  13. * @author Flying Rat
  14. * @date 2015-01-13 10:59:42
  15. */
  16. @Bizlet("数据对象操作扩展")
  17. public class DataObjectUtilX {
  18. @Bizlet("为数据对象指定属性填充数据")
  19. public static DataObject setProperty(DataObject dataObject, String key, String value) {
  20. if (dataObject == null) {
  21. return null;
  22. }
  23. if (StringUtil.isBlank(key)) {
  24. throw new EOSRuntimeException(ExceptionConstant.PARAM_IS_BLANK, new String[] { "key:" + key });
  25. }
  26. dataObject.set(key, value);
  27. return dataObject;
  28. }
  29. @Bizlet("为数据对象指定属性填充数据,深层填充。")
  30. public static DataObject setProperty(DataObject dataObject, String key, Object value, boolean recursion) {
  31. if (dataObject == null) {
  32. return null;
  33. }
  34. if (StringUtil.isBlank(key)) {
  35. throw new EOSRuntimeException(ExceptionConstant.PARAM_IS_BLANK, new String[] { "key:" + key });
  36. }
  37. dataObject.set(key, value);
  38. @SuppressWarnings("unchecked")
  39. List<Property> list = dataObject.getInstanceProperties();
  40. for (Property prop : list) {
  41. if (dataObject.isSet(prop)) {// 如果该属性可配置
  42. if (prop.getName().equals(key)) {
  43. if (prop.getType().isDataType()) {
  44. dataObject.set(key, DataUtil.toSDOValue(prop.getType(), value));
  45. } else {
  46. dataObject.set(key, value);
  47. }
  48. } else if (recursion && !prop.getType().isDataType()) {
  49. @SuppressWarnings("unchecked")
  50. List<DataObject> subObject = (List<DataObject>) dataObject.get(prop);
  51. for (DataObject o : subObject) {
  52. DataObjectUtilX.setProperty(o, key, value, recursion);
  53. }
  54. }
  55. }
  56. }
  57. return dataObject;
  58. }
  59. @Bizlet("将DataObject转化为目标实体类型的DataObject,深层转化。")
  60. public static DataObject convertDataObject(DataObject srcDataObject) {
  61. if (srcDataObject == null) {
  62. return null;
  63. }
  64. String targetEntityName = null;
  65. @SuppressWarnings("unchecked")
  66. List<Property> list = srcDataObject.getInstanceProperties();
  67. for (Property srcProp : list) {
  68. if (srcDataObject.isSet(srcProp)) {// 如果该属性可配置
  69. String propertyName = srcProp.getName();// 获取该属性名
  70. if ("targetHead".equals(propertyName)) {
  71. targetEntityName = ((TypeReference) srcProp.getType()).getEntityName();
  72. }
  73. }
  74. }
  75. if (StringUtil.isBlank(targetEntityName)) {
  76. throw new EOSRuntimeException(ExceptionConstant.PARAM_IS_BLANK, new String[] { "targetEntityName" });
  77. }
  78. DataObject targetDataObject = DataObjectUtil.createDataObject(targetEntityName);
  79. for (Property srcProp : list) {
  80. if (srcDataObject.isSet(srcProp)) {// 如果该属性可配置
  81. Object value = srcDataObject.get(srcProp);// 获取该属性值
  82. String propertyName = srcProp.getName();// 获取该属性名
  83. if (srcProp.getType().isDataType()) {
  84. Property targetProp = targetDataObject.getInstanceProperty(propertyName);// 实例化目标对象的该属性
  85. if (null != targetProp) {// 如果目标对象存在该属性
  86. if (targetProp.getType().isDataType()) {
  87. targetDataObject.set(propertyName, DataUtil.toSDOValue(targetProp.getType(), value));
  88. } else {
  89. targetDataObject.set(propertyName, value);
  90. }
  91. } else if (targetDataObject.getType().isOpen()) {
  92. targetDataObject.set(propertyName, value);
  93. }
  94. } else {
  95. String propName = srcProp.getName();
  96. Property targetProp = targetDataObject.getInstanceProperty(propName);
  97. if (null != targetProp) {// 如果目标对象存在该属性
  98. if (srcProp.isMany()) {
  99. DataObject[] d = DataObjectUtil.convertDataObjects(value, ((TypeReference) targetProp.getType()).getEntityName(), true);
  100. targetDataObject.set(propName, d);
  101. } else {
  102. DataObject d = DataObjectUtil.convertDataObject((DataObject) value, ((TypeReference) targetProp.getType()).getEntityName(), true);
  103. targetDataObject.set(propName, d);
  104. }
  105. }
  106. }
  107. }
  108. }
  109. return targetDataObject;
  110. }
  111. @Bizlet("将DataObject转化为目标实体类型的DataObject,深层转化。")
  112. public static DataObject convertDataObject(DataObject srcDataObject, String targetEntityName) {
  113. if (srcDataObject == null) {
  114. return null;
  115. }
  116. if (StringUtil.isBlank(targetEntityName)) {
  117. throw new EOSRuntimeException(ExceptionConstant.PARAM_IS_BLANK, new String[] { "targetEntityName" });
  118. }
  119. DataObject targetDataObject = DataObjectUtil.createDataObject(targetEntityName);
  120. @SuppressWarnings("unchecked")
  121. List<Property> list = srcDataObject.getInstanceProperties();
  122. for (Property srcProp : list) {
  123. if (srcDataObject.isSet(srcProp)) {// 如果该属性可配置
  124. Object value = srcDataObject.get(srcProp);// 获取该属性值
  125. String propertyName = srcProp.getName();// 获取该属性名
  126. if (srcProp.getType().isDataType()) {
  127. Property targetProp = targetDataObject.getInstanceProperty(propertyName);// 实例化目标对象的该属性
  128. if (null != targetProp) {// 如果目标对象存在该属性
  129. if (targetProp.getType().isDataType()) {
  130. targetDataObject.set(propertyName, DataUtil .toSDOValue(targetProp.getType(), value));
  131. } else {
  132. targetDataObject.set(propertyName, value);
  133. }
  134. } else if (targetDataObject.getType().isOpen()) {
  135. targetDataObject.set(propertyName, value);
  136. }
  137. } else {
  138. String propName = srcProp.getName();
  139. Property targetProp = targetDataObject.getInstanceProperty(propName);
  140. if (null != targetProp) {// 如果目标对象存在该属性
  141. if (srcProp.isMany()) {
  142. DataObject[] d = DataObjectUtil.convertDataObjects(value, ((TypeReference) targetProp.getType()).getEntityName(), true);
  143. targetDataObject.set(propName, d);
  144. } else {
  145. DataObject d = DataObjectUtil.convertDataObject((DataObject) value, ((TypeReference) targetProp.getType()).getEntityName(), true);
  146. targetDataObject.set(propName, d);
  147. }
  148. }
  149. }
  150. }
  151. }
  152. return targetDataObject;
  153. }
  154. }

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

文章来源: kanshan.blog.csdn.net,作者:看山,版权归原作者所有,如需转载,请联系作者。

原文链接:kanshan.blog.csdn.net/article/details/43308623

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。