2012-08-03 80 views
0

我的目標之一是創建一個引擎,它將使用反射動態地從JPA對象中設置pojo對象中的值。匹配標準之一是,字段名稱應該匹配。如何使用反射從JPA對象檢索私有變量屬性

我成功地實現了這兩個pojo對象。但是,當我嘗試使用JPA對象作爲對象參數之一時,它不起作用。根據我的研究,我發現方法Class.getDeclaredFields()不會給我該字段的名稱,而是給出JPA對象的成員變量的getter/setter方法名稱。

任何人都可以請給我一個領導或方向,在哪裏/我應該看什麼來完成這項任務?

回答

2

JPA提供程序通常會使用具體JPA類的dynamic proxy classes,因此您無法保證代理中的字段名稱。關於代理的唯一保證是方法是相同的。使用調試器來檢查您嘗試使用的JPA類實例的運行時類,您將看到問題。

您可以做的最好的事情就是使用反射來調用JPA返回對象上的方法。


所有這一切不談,我真的不明白你爲什麼會需要反正POJO的IFY的實體類,因爲實體主要是一個註釋... POJO。

+0

感謝馬特工作。我們必須創建pojo -DTO類的原因是爲了解耦我們的領域模型對象上的客戶端依賴關係。 – kcoder 2012-08-06 17:33:36

+0

太棒了!如果我的答案解決了您的問題,您是否介意[接受它?](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)謝謝。 – 2012-08-06 17:39:27

0

其中一個匹配標準是字段名稱應該匹配。

我認爲這是你問題的根源。無法保證Java對象的字段名稱將與getter和setter的名稱匹配......或其他任何內容。如果你做出這個假設,你會遇到不能正常工作的情況。

最好的解決辦法就是不要使用這種方法。要求Pojo類符合JavaBeans規範並依賴setter來設置屬性。這比起對(私人)字段名稱的假設可能更常見。


事實上,使用動態代理很可能在哈希映射舉行的通用JPA對象的狀態來實現。你可以看到的那些字段可以簡單地作爲用於別的東西的常量。

+0

感謝大家後來的幫助,我發現了一些與我想實現的內容非常相似的東西http://dozer.sourceforge.net/documentation/about.html – kcoder 2012-08-09 20:35:11