开发者社区> 问答> 正文

当具体的JPA实体类与其通用超类位于不同的包中时,问题加载应用程序

最近,我正在重组和重构代码,其中一项任务是将类归类到逻辑组/程序包中。由于我在泛型中使用了很多继承/子类,因此我通常将父类留在原处,并将其子类移到单独的子包中。

下面是目录(以及程序包)层次结构的示例,该示例显示了我如何完成该任务:

Pet-Registration/src/main/java/com/stackoverflow
├── controller
│   ├── PetOwnerController.java
│   ├── dog
│   │   └── DogOwnerController.java
│   └── cat
│       └── CatOwnerController.java
├── dbmodel
│   ├── Pet.java
│   ├── PetOwner.java
│   ├── dog
│   │   ├── Dog.java
│   │   └── DogOwner.java
│   └── cat
│       ├── Cat.java
│       └── CatOwner.java
├── repository
│   ├── PetOwnerRepository.java
│   ├── dog
│   │   └── DogOwnerRepository.java
│   └── cat
│       └── CatOwnerRepository.java
└── service
    ├── PetOwnerService.java
    ├── dog
    │   └── DogOwnerService.java
    └── cat
        └── CatOwnerService.java

在进行优化之前,目录层次结构几乎相同,只是在所示示例中我没有像'dog'和'cat'这样的软件包。

当我尝试运行Spring Boot应用程序时,由于以下未处理的异常,它很快崩溃了:

org.springframework.beans.factory.BeanCreationException:在类路径资源[org / springframework / boot / autoconfigure / orm / jpa / HibernateJpaConfiguration.class]中创建名称为'entityManagerFactory'的bean时出错。嵌套的异常是org.hibernate.AnnotationException:属性com.stackoverflow.dbmodel.PetOwner.pets具有未绑定的类型,没有明确的目标实体。解决此通用用法问题或设置一个明确的目标属性(例如,@ OneToMany(target =)或使用一个明确的@Type

当我还原“ dbmodel”目录/软件包中移动文件的更改时,该应用程序便能够正常工作。

由于这种行为,我得出的结论是,Spring可能仅在该类所在的包中寻找抽象实体类的具体类(带有@Entity注释的类)。

问题是:我的结论正确吗?如果是,是否有任何解决方法可以保留上述层次结构而又不会导致应用程序无法正常工作?

下面,我提供了实体类及其一些子类的类定义,以使此问题更易于重现:

PetOwner.java

@Entity
public abstract class PetOwner<PET extends Pet<?>> implements Serializable {

    @Id
    private String id;

    private String firstName;

    @OneToMany(mappedBy = "owner", orphanRemoval = true, cascade = CascadeType.ALL)
    private List<PET
>```  
 pets;
}
DogOwner.java
```js
@Entity
public class DogOwner extends PetOwner<Dog> {
}

宠物

@Entity
public abstract class Pet<OWNER extends PetOwner<?>> implements Serializable {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @ManyToOne(optional = false)
    private OWNER owner;
}

狗.java

@Entity
public class Dog extends Pet<DogOwner> {
}

展开
收起
几许相思几点泪 2019-12-22 18:29:45 890 0
1 条回答
写回答
取消 提交回答
  • 技术架构师 阿里云开发者社区技术专家博主 CSDN签约专栏技术博主 掘金签约技术博主 云安全联盟专家 众多开源代码库Commiter

    查看下报的错,很明显的jpa使用异常

    2020-01-05 20:24:47
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
继承与功能组合 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载