0

サービス層に次のメソッド呼び出しがあります。

saveAdvertisement(childminderAdvertisement);

.. から次のメソッドを呼び出しますAdvertisementServiceImpl

public void saveAdvertisement(Advertisement advertisement) {
  advertisementRepository.save(advertisement);
}

AdvertisementRepository次のようにorg.springframework.data.jpa.repository.JpaRepositoryパラメータ化されます。

 JpaRepository<Advertisement, Long>;

ここに私のエンティティがあります:

Advertisement:

@RooJavaBean
@RooToString
@RooEquals
@RooJpaEntity(inheritanceType = "TABLE_PER_CLASS")
@Entity
public abstract class Advertisement {
...

ChildminderAdvertisement:

@RooJavaBean
@RooToString
@RooEquals
@RooJpaEntity
@Entity
public class ChildminderAdvertisement extends Advertisement {
...

AdvertisementRepository(スーパークラス Advertisement で型パラメーター化されている) がインスタンスをChildminderAdvertisement適切に保持していることに気付きました。

私の質問は 2 つあります。

- スーパークラスの JpaRepository を使用しているのに、Spring Data Jpa はサブクラスのインスタンスをどのように永続化しますか?

- スーパークラスを型パラメータとして使用することの欠点は何ですか?

4

1 に答える 1

1

Q1 へ:サブクラスのインスタンスを永続化するのは Spring ではなく、JPA プロバイダーです。Spring は呼び出しを JPA プロバイダーに委任するだけです。そして、それが永続化可能なクラス (つまり @Entity) であるinstance.getClass()かどうかの検査を呼び出すことで、それを管理します。class

Q2へ:個人的には特にデメリットは感じません。JpaRepositoryもちろん、より具体的なサブタイプでのみ機能する の拡張が必要な​​場合ChildminderAdvertisement(たとえば、 a の保存時にのみ、ChildminderAdvertisement いくつかの余分なものをログに記録する必要があります)、 の実装が必要ですJpaRepository<ChildminderAdvertisement, Long>

于 2013-10-07T09:59:53.500 に答える