2

Web プロジェクト用にいくつかの DAO クラスを実装していますが、何らかの理由で JDBC を使用する必要があります。

今、私は次のようなエンティティを返したいと思います:

public class Customer{

    // instead of int userId
    private User user;

    // instead of int activityId
    private Activity act;


    // ...
}

JPAuserを使用activityすると、簡単にロードできます(エンティティ間の関係を自動的に指定します)。

しかし、どのように JDBC を使用するのでしょうか? これを達成する一般的な方法はありますか?にeveritingをロードする必要がありますCustomerDAOか? 参照エンティティの遅延初期化を実装することは可能ですか?

私の最初のアイデアは、 my に実装することでしたUserDAO:

public void initUser(Customer customer);

そして私の中でActivityDAO

public void initActivity(Customer customer);

で変数を初期化しますcustomer

4

2 に答える 2

1

ActiveRecordルート

これはAspectJITDを使用して行うことができ、基本的にエンティティをオブジェクトのようなActiveRecordにすることができます。

基本的に、「HasUser」および「HasActivity」と呼ばれるインターフェースを実装するクラスにアドバイスするアスペクトを作成します。あなたのインターフェースHasUserHasActivityはゲッターを定義するだけです。次に、との実際の実装に織り込まれるアスペクトを作成しgetUser()ますgetActivity()

あなたの側面が実際のJDBC作業を行います。AspectJの学習曲線は最初は急勾配ですが、コードがはるかにエレガントになります。

AspectJITDスタックオーバーフローの投稿で私の答えの1つを見ることができます。

@Configurableまた、依存関係(データソースやjdbcテンプレートなど)を管理されていないSpringBeanに自動配線するSpringも確認する必要があります。

もちろん、これが実際に動作していることを確認する最良の例は、SpringRooです。生成されるAspectJファイルを見るだけで、@ Configurableの使用方法(必ずactiverecordアノテーションを使用する)のアイデアを得ることができます(rooがJPAを使用することは認められています)。

DAOルート

あなたが本当にこれに必要なよりもDAOルートに行きたいのなら:

public class Customer{

    // instead of int userId
    private Integer userId;

    // instead of int activityId
    private Integer activityId;

}

DAOパターンでは、エンティティオブジェクトに動作が想定されていないためです。サービスやDAOは、転送オブジェクトを作成する必要があります。または、遅延読み込みをアタッチすることもできます。

于 2012-06-14T14:24:26.930 に答える
0

これについて自動化されたアプローチがあるかどうかはわかりません。ORM を使用しない場合、通常、参照型がデフォルトで null に初期化されるシングルトンとして getter を定義します。つまり、フェッチ関数はプリミティブ + 文字列をロードし、それらを null のままにします。が必要getUser()になると、getter はこれが null かどうかを確認し、そうであれば、顧客の ID に基づいて別の select ステートメントを発行します。

于 2012-06-14T13:42:24.490 に答える