4

Hibernate には引数のないコンストラクターが必要であり、メソッドのオーバーロードをサポートするすべての言語ではおそらく問題にはなりませんが、ColdFusion ORM (内部で Hibernate に依存している) で非常に厄介な問題に直面しました。

エンティティのカスタム コンストラクタ (init メソッド) を宣言し、そのコンストラクタがいくつかの引数を必要とする場合、カスタム コンストラクタを呼び出しているため、Hibernate はエンティティのリハイドレートに失敗します。

その動作のために、常に有効なエンティティを設計することはほとんど不可能に思われ、したがって CF-ORM はほとんど役に立たなくなります。

私が見つけた唯一の回避策は、コンストラクターとして使用する別のカスタム メソッドを宣言することです。これにより、オブジェクトのインスタンス化が or のようになりnew SomeEntity().construct(...)ますcreateObject('component', 'SomeEntity').construct(...)。それはかなり面倒です...

initこのすべてで非常にばかげているのは、を使用してメソッドを呼び出さずにエンティティをインスタンス化できることです。そのため、パラメーターを渡さず、後で他のパラメーターを設定するという事実を考慮して、createObjectなぜ Hibernate に実装でメソッドを呼び出させることにしたのか疑問に思います。init意味。

とにかく、その問題に対する他の回避策はありますか?

編集:

Adobe Bugbase にバグを報告しました。

4

3 に答える 3

0

このリクエストを承認するために多くの努力を重ねた結果、修正されました。

ニミット・シャルマ

2015 年 11 月 20 日午前 5:08:05 GMT+00:00

この問題は修正されており、修正は ColdFusion の次のメジャー リリースの一部として利用可能になります。

この問題に対処するために、コンポーネント レベルでプロパティ「orminitmethod」を導入しました。サブコンポーネントは orminit メソッドを継承しません。initmethod とまったく同じように動作します。

アプリケーションレベルの設定を行うために、別の追跡バグ #4090267 をログに記録しました

于 2016-09-16T01:30:43.117 に答える
0

常に有効なエンティティはめったに存在しません。したがって、ある種の検証メソッドを持つことは、使用できるルートの 1 つになる可能性があります。

または、独自のオブジェクトをそのまま保持し、DAO レイヤーでのみ ORM を使用することもできます。ただし、同様のクラスの別のセットがありますが、そうです、それが人々が ORM を好まない理由です。

于 2015-02-01T21:39:21.260 に答える
0

エンティティに空のコンストラクタがない場合、Hibernate はエンティティをインスタンス化するときに提供するパラメータを認識できません。

宣言されたコンストラクターを使用するため、デフォルトのコンストラクターを作成するprotectedと、Hibernate がそれを見つけます。PojoInstantiator

constructor = ReflectHelper.getDefaultConstructor( mappedClass );

オーバーロードされたコンストラクターを使用する代わりに、ビルダーを定義してエンティティを構築できます。

このようにしてBuilder、デフォルトのコンストラクターではなく、 のみがクライアント API によって使用されるようにすることができます。

于 2015-03-14T16:56:39.560 に答える