0

私の目標の 1 つは、リフレクションを使用して動的に JPA オブジェクトから pojo オブジェクトに値を設定するエンジンを作成することです。一致基準の 1 つは、フィールド名が一致することです。

これを 2 つの pojo オブジェクトに実装することに成功しました。しかし、JPA オブジェクトを object パラメータの 1 つとして使用しようとすると、うまくいきませんでした。私の調査に基づいて、メソッドClass.getDeclaredFields()はフィールドの名前ではなく、JPAオブジェクトのメンバー変数のゲッター/セッターメソッド名を提供することがわかりました。

このタスクを達成するためにどこ/何を探すべきかについて、誰かが私にリードまたは指示を与えることができますか?

4

2 に答える 2

2

JPA プロバイダーは、具体的な JPA クラスの動的プロキシ クラスを使用することが多いため、プロキシ内のフィールド名は保証されません。プロキシに関する唯一の保証は、メソッドが同じであることです。デバッガーを使用して、使用しようとしている JPA クラス インスタンスのランタイム クラスを調べると、問題が表示されます。

最善の方法は、リフレクションを使用して、JPA から返されたオブジェクトのメソッドを呼び出すことです。


それはさておき、エンティティは主に注釈付きの... POJOであるため、とにかくエンティティクラスをPOJO化する必要がある理由がよくわかりません。

于 2012-08-03T23:40:04.957 に答える
0

一致基準の 1 つは、フィールド名が一致することです。

これがあなたの問題の根源だと思います。Java オブジェクトのフィールド名が getter および setter の名前と一致するという保証はまったくありません。この仮定を行うと、それが機能しない場合に遭遇します。

最善の解決策は、このアプローチを使用しないことです。Pojo クラスが JavaBeans 仕様に準拠し、setter に依存してプロパティを設定することを要件にします。これは、(プライベート) フィールド名について仮定するよりも頻繁に機能する可能性があります。


実際、動的プロキシーを使用して実装された汎用 JPA オブジェクトの状態は、ハッシュ・マップに保持することができます。あなたが見ることができるそれらのフィールドは、単に他の何かに使用される定数である可能性があります.

于 2012-08-03T23:53:04.370 に答える