当具体的JPA实体类与其通用超类位于不同的包中时,问题加载应用程序-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

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

几许相思几点泪 2019-12-22 18:29:45 143

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

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

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> {
}
JavaScript Java Spring
分享到
取消 提交回答
全部回答(1)
  • huc_逆天
    2020-01-05 20:24:47

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

    0 0
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题