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 ;闻起来太过让我相信它了。
非常感谢。