2015-04-17 47 views
0

短版:如何實現修改「JPA entitiy-object結構」的參數變體?

我想從數據庫加載的對象樹並然後修改它在存儲器中(通過施加一個設置文件),以便能夠進行參數的變化。有這樣做的最佳做法嗎? JPA是否爲我提供了一些支持,例如從額外的「差異數據庫」更新持久化上下文?是否有參數變化/掃描/批處理框架支持JPA持續存在?

龍版本:

我有一個使用JPA(休眠)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_large'
  • 代替與對象 'bar_third' 完整對象 'bar_second'(ID = 3)

另一種輸入文件可以指定到

  • 使用另一個對象樹,以 'foo_alternative_root'(ID = 2)
  • 使用memory_size = 500 'foo_alternative_root'

我應該如何實現對象樹的修改?

選項:

下列選項來到我的腦海:

的Simualator從數據庫加載的對象樹,比修改內存對象樹。

a)輸入文件通過對象樹進行傳遞,樹中的每個對象檢查是否應該修改它,如果是,則更改其屬性或交換一些子對象。爲了能夠交換一個子對象,它必須能夠從數據庫中加載新的子對象。 (或者這樣的新的子對象必須在開始時被確定並且與輸入文件一起通過樹。)

b)設置控制器改變整個樹的屬性,例如,通過反思。它不需要遍歷整棵樹。它只處理輸入文件中給出的一些特定的樹位置。

二,模擬器加載完整數據庫並將其複製到內存數據庫。它通過使用SQL查詢來調整內存數據庫來應用輸入文件。在第三步中,它使用JPA從修改後的內存數據庫中加載對象樹。

三, SweepMaster創建許多臨時副本原始數據庫中的對象樹,並根據用戶輸入修改它們。然後它指示模擬器使用那些適配的重複項。參數變化完成後,SweepMaster刪除臨時文件。

有沒有更多的解決方案?你有什麼類似的任務經驗?

回答

0

我決定去選項I b),我將介紹一些可以在參數變化中使用的字段的自定義註釋,例如,克

  • @ParameterPath( 「foo_root」)

  • @Parameter( 「qux_huge」)

foo.baa = 5

這會給我的選項進行內部重構(例如,更改字段的名稱),而不需要直接更改參數變化的輸入文件。

設置控制器將遍歷輸入文件並通過反射搜索相應的註釋字段。它還會要求工廠創建應該用作該字段值的對象。最後,設置控制器將通過反射設置字段的值。

如果我想爲我的參數變體使用一個新類型的附加字段,我將不得不註釋該字段並擴展新類型的工廠。