1

私は現在、Spring Roo/JPA アプリケーションに取り組んでおり、最近、JPA 継承に基づくドメイン モデルに切り替えました。ドメイン モデルを要約すると、 と のMember2 つのエンティティによってサブクラス化された抽象エンティティがMaleありFemaleます。

Maleすべての Spring MVC コントローラーで、常に 2 つのサービス依存関係 (エンティティを処理するものとエンティティを処理するもの)を注入することは避けたいと考えていFemaleます。インスタンスまたはインスタンスのいずれかを返す1 つのMemberServiceサービス (対応する と一緒に) が必要です。MemberRepositoryMaleFemale

次のような Spring Roo アノテーションを使用して、上記は可能ですか。

  • @RooService(domainTypes = { Member.class })またはそれ:
  • @RooJpaRepository(domainType = Member.class)?

たとえば、これはまたは型にキャストMember findByEmail(String email);できるオブジェクトを返しますか?FemaleMale

より一般的には、Spring コントローラーと Spring サービスのレベルでエンティティの継承を処理するためのベスト プラクティスは何ですか?

4

1 に答える 1

0

最良の方法は、次を使用して男性用と女性用のリポジトリを提供することだと思います。

repository jpa --interface ~.repository.MaleRepository --entity ~.domain.Male
repository jpa --interface ~.repository.FemaleRepository --entity ~.domain.Female

あなたが得る:

@RooJpaRepository(domainType = Female.class)
public interface FemaleRepository {
}

@RooJpaRepository(domainType = Male.class)
public interface MaleRepository {
}

次に、これらのモデルのアプリケーションのサービス レイヤーを作成します (モデルごとのサービス)。

service --interface ~.service.MaleService --entity ~.domain.Male
service --interface ~.service.FamaleService --entity ~.domain.Female

そして、あなたは得る:

@RooService(domainTypes = { Male.class })
public interface MaleService {
}

@RooService(domainTypes = { Female.class })
public interface FemaleService {
}

これは、男性と女性のオブジェクトが異なる責任を持っていると仮定しているため、異なるクラスに分ける必要があるため、それらに付けた名前 (男性と女性) ではないと思いますが、ビジネスロジックはわかりません。もちろん、これは単なる例です (しかし、実際の問題にどれほど忠実ですか?)。

継承の考え方は、「is-a」の子孫に共通の機能を共有するだけでなく、OO ロジックの意味を保持することです。つまり、この場合、たとえば、sex という属性で問題を解決できます。男性と女性の属性が同じ場合。そうでない場合は、それらの特殊なオブジェクト用に異なるリポジトリとサービスを作成するのに苦労することはありません。

于 2012-09-26T16:10:28.530 に答える