2017-01-06 8 views
2

** 1。サービスの使用法:休止状態の春のチュートリアルを見ると、エンティティ(例えば、私の場合はUser)に対して、find、findAll、deleteなどのメソッドを持つUserRepositoryというリポジトリが必要です。通常、UserRepositoryはいくつかのベースリポジトリインタフェース。Hibernateを使用する場合、DTOとエンティティをサービスとDAOでフェッチするベストプラクティス

次に、UserRepositoryを注入するUserServiceを追加する必要があります。

。私はUserServiceImplによって実装されているUserServiceインターフェイスを持っている必要がありますか?私の観点からは、これを持つ価値はありません。私はUserServiceをクラスにし、JDKInterfacesの代わりにGCLIBを使ってプロキシを作成するSpringの能力を使用することができます。

b。 UserRepositoryのすべてのメソッドをコピーし、@Autowiredリポジトリに委譲してUserServiceを記述し、他のbussinessメソッドを追加するのは正しいですか?

c。私のUserServiceにbussinessメソッドがない場合、UserRepositoryにすべてを委譲します。ただ、UserServiceをスキップして、RESTレイヤーからUserRepoisitoryに直接アクセスできますか?

d。私はAddressエンティティも持っているとしましょう。ユーザーは保存時にアドレスを必要とします(one2oneは必須です)。 UserServiceからUserRepositoryとAddressRepositoryの両方を注入してそこに関係を設定し、各リポジトリでsaveを呼び出すのは大丈夫ですか? (カスケードを使用したくない場合は、カスケーディングを使用できない状況では、どうしたらいいか知りたい)

2. DTO使用法:データを読み込む場合は、 JPQL(またはCriteria、私はJPQLを好む)を通して直接的にDTOをフェッチすることができます。

。私の観点からは、私は常にエンティティのフェッチの代わりにDTOを使用します。なぜなら、SQLは単純だと思うし、エンティティのマージ、デタッチ、アタッチなどについて考えなければならないと思うので、SQLのシンプルさが失われ、ORMはパフォーマンスと複雑さの面で敵になるからです。ですから、データを変更するときにデータとエンティティを読み取るときは、常にDTOを使用します。どう思いますか?

b。 Userエンティティからすべての列を戻したい。 UserDToを持っていても大丈夫ですか、私は誇張していて、Userエンティティだけを返すべきですか?私は50%〜50%です。

c。私はUserから部分的にいくつかの列を返したい。ここで私は75%DTOと25%エンティティです。どう思いますか?

d。私はUserのいくつかの列とAddressのいくつかの列を返したい。ここで私はDTOの100%ですが(フェッチアドレスに参加することはできますが)。どう思いますか?

敬具、

答えて

7

私はそれらを一つずつお答えします:

1.A)はい、それは意味を成しません。サービスレイヤはトランザクション境界であり、コースロジックのインターフェイスを介してビジネスロジックを外部世界に公開します。

1.b)いいえ、そうではありません。UserServiceはビジネスメソッドを定義し、データアクセスメソッドは定義しません。

1.c)私はまだサービスを続けます。

1d)もちろんです。エンティティ名でサービスを呼び出す必要はありません。彼らが表現しているビジネスロジックの懸念事項に名前を付けます。

2.a)私のルールは単純です。エンティティを変更する予定のあるエンティティと、読み取り専用の予測のDTOです。

2.b)2.aと同じです。

2.c)2.aと同じです。 If you need to modify the fetched data later, then use subentities

2d)2.aと同じ。データを変更する必要がある場合は、エンティティまたはサブテントを使用します。それ以外の場合は、読み取り専用投影のDTOです。

+1

偉大な答え! 2aのルールに例外を追加したいと思います。場合によっては、サービスレイヤの外側から変更してはならない属性を持つこともあります。 g。更新タイムスタンプ属性のようなものです。この場合、更新可能な属性を持つDTOを使用する必要があります。場合によっては、作成するための別の属性セットがあります。次に、別のタイプのDTOを使用して作成する必要があります。 – Javatar81

+0

真。変更が許可されているサブバージョンバージョンのみを返すのはサービスレイヤーの責任であるため、更新しないでください。 –

関連する問題