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

时间:2015-04-17 09:18:59

标签: jpa entity batch-processing variation

简短版:

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

长版:

我有一个模拟程序'模拟器'使用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'包含一列颜色'和对象' qux_large' (表qux中的id 1)具有属性color = green。

模拟程序适用于单次模拟。现在我想实施第二个程序' SweepMaster'能够执行参数变化/扫描/批处理:

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

一个单独的输入文件指定例如

  • 加载以' foo_root'开头的对象树(id = 1)
  • 使用color = yellow来表示' qux_large'
  • 替换整个对象' bar_second'用一个物体' bar_third' (id = 3)

另一个输入文件可能指定为

  • 使用另一个对象树,从' foo_alternative_root'开始(id = 2)
  • 使用memory_size = 500表示' foo_alternative_root'

我应该如何实现对象树的修改?

选项:

我想到了以下选项:

我。 Simualator从数据库加载一个对象树,然后修改内存中的对象树

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

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

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

III。 SweepMaster在原始数据库中创建对象树的许多临时副本,并根据用户输入修改它们。然后它指示模拟器使用那些适应的重复项。参数变化完成后,SweepMaster会删除临时文件。

还有其他解决方案吗?您对类似任务有什么经验?

1 个答案:

答案 0 :(得分:0)

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

  • @ParameterPath(" foo_root")

  • @Parameter(" qux_huge&#34)

foo.baa = 5

这将为我提供进行内部重构的选项(例如,更改字段的名称),而无需直接更改参数变体的输入文件。

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

如果我想为我的参数变体使用新类型的附加字段,我将需要注释该字段并扩展新类型的工厂。