2013-10-03 1 views
0

У меня есть метод следующий вызов в моем слое службы:Spring Data osdata.jpa.repository.JpaRepository Сохраним метода и полиморфизм

saveAdvertisement(childminderAdvertisement); 

..which в вызовах следующих методов из 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 (который имеет тип-parametized с супер класс реклама) удаляет ошибки в ChildminderAdvertisement.

Мой вопрос имеет два аспекта:

- как делает Spring Data JPA удается сохраняться экземпляр подкласса в то время как я использую JpaRepository из суперкласса?

- Каковы недостатки (если они есть) использования суперкласса в качестве параметра типа?

ответ

1

К Q1: Это не Spring, которому удается сохранить экземпляр подкласса, но это ваш поставщик JPA. Spring только делегирует вызов провайдеру JPA. И это, в свою очередь, управляет этим, вызывая instance.getClass(), проверяя, является ли этот class устойчивым классом (т. Е. @Entity).

К Q2: Я лично не вижу недостатков. Конечно, если вам нужно расширение JpaRepository, которое работает ТОЛЬКО с более конкретным подтипом ChildminderAdvertisement (например, только при сохранении ChildminderAdvertisement вам нужно записать некоторые дополнительные материалы), тогда вам понадобится реализация JpaRepository<ChildminderAdvertisement, Long>.

+0

Спасибо за ваш ответ Андрей. Я вижу ... Тогда это просто вопрос использования 'JpaRepository ', когда я манипулирую только экземплярами ChilminderAdvertisement и 'JpaRepository ' в противном случае? – balteo

+0

В моем примере выше, да. Но в целом это зависит от вашей проблемы: нужны ли вам специальные/дополнительные/расширенные операции/функциональные возможности в «ChildminderAdvertisement» (обычно в подтипе). Как я понимаю из вашего дела в вопросе, ваш 'JpaRepository ' просто идеален, чтобы оставаться таким и использоваться также для «ChildminderAdvertisement». –

+0

Спасибо, Андрей! – balteo