最近,我正在重组和重构代码,其中一项任务是将类归类到逻辑组/程序包中。由于我在泛型中使用了很多继承/子类,因此我通常将父类留在原处,并将其子类移到单独的子包中。
下面是目录(以及程序包)层次结构的示例,该示例显示了我如何完成该任务:
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> {
}
查看下报的错,很明显的jpa使用异常
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。