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
非常适合保持这种状态,也可用于儿童看护广告。