Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何实现修改“a”的参数变化;JPA实体对象结构;?_Jpa_Entity_Batch Processing_Variation - Fatal编程技术网

如何实现修改“a”的参数变化;JPA实体对象结构;?

如何实现修改“a”的参数变化;JPA实体对象结构;?,jpa,entity,batch-processing,variation,Jpa,Entity,Batch Processing,Variation,短版: 我想从数据库加载对象树,然后在内存中修改它(通过应用设置文件),以便能够执行参数变化。是否有这样做的最佳实践?JPA是否对此提供了一些支持,例如从一个额外的“diff数据库”更新持久性上下文?是否存在支持JPA持久性的参数变化/扫描/批处理框架 长版本: 我有一个模拟程序“Simulator”,它使用JPA(Hibernate)从MySQL数据库加载业务对象:您可以想象从数据库加载的对象的树结构。业务对象的类对应于数据库中的表(foo、bar、qux) 对象树: foo_root (id

短版:

我想从数据库加载对象树,然后在内存中修改它(通过应用设置文件),以便能够执行参数变化。是否有这样做的最佳实践?JPA是否对此提供了一些支持,例如从一个额外的“diff数据库”更新持久性上下文?是否存在支持JPA持久性的参数变化/扫描/批处理框架

长版本:

我有一个模拟程序“Simulator”,它使用JPA(Hibernate)从MySQL数据库加载业务对象:您可以想象从数据库加载的对象的树结构。业务对象的类对应于数据库中的表(foo、bar、qux)

对象树:

foo_root (id =1)
+ bar_first (id =1)
 ++ qux_large (id = 1)
+ bar_second (id = 2)
 ++ qux_small (id = 2)
 ++ qux_medium (id = 3)
 ++ qux_huge (id = 4)
树中的对象(例如“bar_first”)对应于数据库表中的一行,并且在该表中具有唯一的id。对象的属性值对应于该表列中的条目。例如,表'qux'包含一列'color',而对象'qux_large'(表qux中的id 1)具有属性color=green

该仿真程序适用于单个仿真。现在我想实现第二个程序“SweepMaster”,它能够执行参数变化/扫描/批处理:

  • 用户指定要修改的某些参数以及这些参数的值范围。参数可能对应于完整的对象(-id)或对象树中对象的属性。
    • SweepMaster创建一组输入文件,并为每个单独的输入文件调用模拟器
    • 模拟器使用JPA加载对象树,并通过应用单个输入文件中的数据来修改树(某些对象/属性)。然后进行仿真
    • 模拟器完成后,SweepMaster将使用下一个输入文件开始下一次模拟
一个单独的输入文件指定,例如

  • 加载以“foo_root”(id=1)开头的对象树
  • 使用颜色=黄色表示“qux_大”
  • 将完整对象“bar_second”替换为对象“bar_second”(id=3)
另一个输入文件可能指定为

  • 使用另一个对象树,从“foo\u alternative\u root”(id=2)开始
  • 对于“foo\u alternative\u root”使用内存大小=500
我应该如何实现对对象树的修改

选项:

我想到了以下几种选择:

I.Simualator从数据库加载对象树,然后修改内存中的对象树

a)输入文件通过对象树传递,树中的每个对象检查是否应该修改,如果应该修改,则更改其属性或交换一些子对象。为了能够交换子对象,它必须能够从数据库加载新的子对象。(或者这些新的子对象必须在开始时确定,并与输入文件一起通过树。)

b)设置控制器更改整个树的属性,例如通过反射。它不需要穿过整棵树。它只处理输入文件中给定的一些特定树位置

II.模拟器加载完整的数据库,并将其复制到内存数据库中。它通过使用SQL查询调整内存中的数据库来应用输入文件。在第三步中,它使用JPA从修改后的内存数据库加载对象树

III.清扫器在原始数据库中创建对象树的许多临时副本并根据用户输入进行修改。然后,它指示模拟器使用这些经过调整的副本。参数更改完成后,SweepMaster将删除临时文件


还有其他解决办法吗?你在类似任务中有哪些经验

我决定选择选项I b),我将为参数变化中可以使用的字段引入一些自定义注释,例如

  • @参数路径(“foo_根”)

  • @参数(“qux_巨大”)

foo.baa=5

这将使我可以选择进行内部重构(例如更改字段名称),而无需直接更改参数变化的输入文件

设置控制器将遍历输入文件,并通过反射搜索相应的注释字段。它还将要求工厂创建应用作该字段值的对象。最后,设置控制器将通过反射设置字段的值

如果我想为我的参数变体使用一个具有新类型的附加字段,我必须对该字段进行注释,并为新类型扩展工厂