2016-10-20 14 views
1

私は、JPAと多層アーキテクチャのコーディング方法が初めてです。私は現在、JPQLを使用してDAOレイヤーを使用してデータベースと通信するためのAPIを作成しており、新しいプロジェクトに取り組んでいます。JPA - DAOレイヤーでのレイジー初期化

現在、データベースからデータを取得するためにJPQLステートメントを作成しました。それに加えて、私は複雑なオブジェクトを取得するために怠惰な初期化も実行しています。 DAOレイヤーで遅延初期化を実行するのが正しいかどうかを知りたい。

エンジンレイヤーとEJBレイヤーと呼ばれるDAOレイヤーの前に、さらに2つのレイヤーがあります。そこでは、データベース接続がアクティブで、そこでも遅延初期化を実行できます。私はそれがDAOレイヤーだけにあるものに関連するデータベースを必要としているので、それを行うのが良いアーキテクチャーな方法であるかどうかを知りたいです。

また、私はDB操作を実行するためにデータベース接続をアクティブにしているので、なぜEJB/Engineレイヤーで遅延初期化を行わないのがいいかと主張するところで立ち往生します。私はこの方法を考えています。なぜなら、再利用できるDAOレイヤーに必要なデータだけを取り出すことができ、異なるクラスの必要に応じて遅延初期化を実行できるからです。

エンジンとEJBレイヤーでDB接続を有効にしている理由がわかりません(これはトランザクション管理用です)。 EJBがステートレスとして定義されていて、そのスコープ内にデータベース接続を持つEngineレベルのクラスがあるというアーキテクトの提案に従って行われています。

大変申し訳ございません。私は質問に答えるために必要な細部を与えてくれることを願っています。

P.S.どのレイヤーが理想的にどのような作業を行う責任があるかを判断するのに役立つ良い本や記事を教えてください。

+1

遅延初期化のポイントは、エンティティのロードが必要になるまで遅延させることですので、私はまだセッション内に "Session"または "Transaction"あなたの場合)。それらをあなたのDAOにロードすることは、あなたが実際にそれらを必要とするかどうか、あるいは怠け者であるという目的を破ることなく、常にそれを行います。私の$ 0.02。 – kjsebastian

+0

返信@conscellsに感謝それは私たちがDAO層を持っているときにEJB層でデータベースの取得を行うのに問題ないですか? – user1901761

+0

Hibernateを使用している場合は、 'Hibernate.initialize(parent.getChildRelation())'と同じくらい簡単です。だから、 'if(userRequestedChild){Hibernate.initialize(...); } return parent; '私の意見では、EJBレイヤーではOKです。 – kjsebastian

答えて

1

私はDAOでやっていることが正しいことだと思います。しかし、一般的な使用のための別の方法を作成します。あなたは部門を取得する方法を持っている場合たとえば、

public List<Department> getDepartments() { 
    //get departments 
    //Also fetch employees in each department here // DON'T DO 
} 

のように正しくすべてのエンティティおよびJavaのドキュメント、それを取得するために具体的な別の方法があると便利だろう。

public List<Department> getDepartmentsWithEmployees() { 
    //get departments 
    //Also fetch employees in each department here  
} 

人々は、必要性のために適切な方法を呼び出すため、パフォーマンス上の問題が発生する可能性が低くなります。

注:可能であれば、結合フェッチを使用してください。

関連する問題