我在服务层中有以下方法调用:
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
(使用超类广告进行类型参数化)设法正确保存ChildminderAdvertisement
个实例。
我的问题有两个:
- Spring Data Jpa如何设法持久化子类的实例,而我使用超类的JpaRepository?
- 使用超类作为类型参数有什么缺点(如果有的话)?
答案 0 :(得分:1)
到Q1: Spring并没有设法保持子类的实例,但它是你的JPA提供者。 Spring只将调用委托给JPA提供者。而这又通过调用instance.getClass()
来检查class
是否是一个可持续的类(即@Entity)来管理它。
到Q2:我个人没有看到任何不利之处。当然,如果您需要JpaRepository
的扩展名仅适用于更具体的ChildminderAdvertisement
子类型(例如,仅在保存ChildminderAdvertisement
时您必须记录一些额外的内容),那么您需要实施JpaRepository<ChildminderAdvertisement, Long>
。