为什么这个JpaRepository可以用于它与之无关的实体?

时间:2018-04-13 15:11:25

标签: java spring spring-boot spring-data-jpa repository

Spring Boot似乎正在幕后做一些不应该工作的事情。

我正在将一个项目移动到Spring Boot,并且正在尝试使用spring-boot-starter-data-jpa来处理对代码库的最少更改,因为我可以逃脱。

在代码库的某处,我们使用多态分派将xml或json文档编组到实体中,并将​​该实体直接发送到数据库,而不确切知道实体的类型。

我们有一个接口实体,我们的许多POJO都从这个实体继承:

public interface Entity {
  Long getId();
  void setId(Long id);
}

示例POJO:

@javax.persistence.Entity
@Table
public class Address implements Entity {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  // fields, getters setters
}

不幸的是,Spring CrudRepository和JpaRepository不允许在泛型签名中使用接口,因此我创建了一个继承自Entity的AbstractEntity。

@javax.persistence.Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name="descriminatorColumn")
public class AbstractEntity implements Entity {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Override
    public Long getId() {
        return id;
    }

    @Override
    public void setId(Long id) {
        this.id = id;
    }
}

然后我为AbstractEntity创建了一个存储库:

public interface AbstractEntityRepository<T extends AbstractEntity, ID> extends JpaRepository<T, ID> {

}

我打算让我的实体POJO继承自AbstractEntity,但在此之前,我注意到我不需要。

以下代码将地址保存到数据库:

@SpringBootApplication
@EnableJpaRepositories("com.remsdaq.resque.officersubscription.*")
@EntityScan("com.remsdaq.resque.officersubscription.*")
public class OfficerSubscription implements CommandLineRunner {

    private static final Logger LOG = getLogger(OfficerSubscription.class);

    @Autowired
    private AbstractEntityRepository repository;

    public static void main(String[] args) throws Exception {
        SpringApplication.run(OfficerSubscription.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        Address address = new Address();
        repository.save(address);
    }
}

所以我的问题是,当AbstractEntity不是Address的超类时,我的AbstractEntityRepository如何工作?

如果有一些合理的理由可以解决这个问题,并且期望这种行为不会改变,那么保持原样可能并不是太糟糕,但不知道这是如何运作的,它是&#39 ;闻起来太过让我相信它了。

非常感谢。

0 个答案:

没有答案