Spring Data o.s.data.jpa.repository.JpaRepository的保存方法和多态

时间:2013-10-03 12:32:55

标签: hibernate inheritance jpa spring-roo spring-data-jpa

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

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?

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

1 个答案:

答案 0 :(得分:1)

到Q1: Spring并没有设法保持子类的实例,但它是你的JPA提供者。 Spring只将调用委托给JPA提供者。而这又通过调用instance.getClass()来检查class是否是一个可持续的类(即@Entity)来管理它。

到Q2:我个人没有看到任何不利之处。当然,如果您需要JpaRepository的扩展名仅适用于更具体的ChildminderAdvertisement子类型(例如,仅在保存ChildminderAdvertisement时您必须记录一些额外的内容),那么您需要实施JpaRepository<ChildminderAdvertisement, Long>