Hibernate Spring Data o.s.Data.jpa.repository.JpaRepository';s保存方法与多态性

Hibernate Spring Data o.s.Data.jpa.repository.JpaRepository';s保存方法与多态性,hibernate,inheritance,jpa,spring-roo,spring-data-jpa,Hibernate,Inheritance,Jpa,Spring Roo,Spring Data Jpa,在我的服务层中有以下方法调用: saveAdvertisement(childminderAdvertisement); ..在中从广告服务impl调用以下方法: public void saveAdvertisement(Advertisement advertisement) { advertisementRepository.save(advertisement); } AdvertisementRepository是一个org.springframework.data.jpa.r

在我的服务层中有以下方法调用:

saveAdvertisement(childminderAdvertisement);
..在中从
广告服务impl
调用以下方法:

public void saveAdvertisement(Advertisement advertisement) {
  advertisementRepository.save(advertisement);
}
AdvertisementRepository
是一个
org.springframework.data.jpa.repository.JpaRepository
参数化如下:

 JpaRepository<Advertisement, Long>;
儿童看护广告

@RooJavaBean
@RooToString
@RooEquals
@RooJpaEntity(inheritanceType = "TABLE_PER_CLASS")
@Entity
public abstract class Advertisement {
...
@RooJavaBean
@RooToString
@RooEquals
@RooJpaEntity
@Entity
public class ChildminderAdvertisement extends Advertisement {
...
我注意到,
AdvertisementRepository
(它用超类advertive
进行了类型参数化)能够正确地保存
ChildminderAdvertisement的实例

我的问题有两个:

-Spring Data Jpa如何保存子类的实例,而我使用的是超类的JpaRepository?


-使用超类作为类型参数的缺点(如果有)是什么?

到Q1:不是Spring成功地持久化了子类的实例,而是您的JPA提供程序。Spring只将调用委托给JPA提供者。然后通过调用
instance.getClass()
检查
class
是否是一个可持久化的类(即@Entity)来管理它


到第二季度:我个人认为没有任何缺点。当然,如果您需要
JpaRepository
的扩展,该扩展只适用于更具体的
childminderadvisement
子类型(例如,仅在保存
childminderadvisement
时,您必须记录一些额外的内容),那么您需要实现
JpaRepository

谢谢你的回复,安德烈。我懂了。。。那么,当我只操作
chilminderadvision
实例时,就只需要使用
JpaRepository
,否则就可以使用
JpaRepository
?在我上面的示例中,是的。但通常情况下,这取决于您的问题:取决于您是否需要对
childminderadvisement
进行特殊/附加/扩展操作/功能(通常取决于子类型)。正如我在问题中从您的案例中了解到的那样,您的
JpaRepository
非常适合保持这种状态,也可用于
儿童看护广告。