问题描述
我尝试从Spring Boot应用程序中的JpaRepository测试我的存储库,但出现此错误:
java.lang.IllegalStateException:无法加载ApplicationContext
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'carDealerRepository' defined in schule.privas.microservice.repository.CarDealerRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Cannot resolve reference to bean 'jpaMappingContext' while setting bean property 'mappingContext'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaMappingContext': Invocation of init method failed; nested exception is org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: schule.privas.microservice.model.Car.cardealer in schule.privas.microservice.model.CarDealer.cars
(“例外列表”要长得多,但我认为这是唯一有趣的部分)
这是我的存储库测试的代码
@Transactional
@SpringBootTest
public class CarDealerRepositoryTest {
@Autowired
private CarDealerRepository carDealerRepository;
private CarDealer carDealer;
private Car car;
@BeforeEach
void initialize(){
carDealer = CarDealer.builder()
.cars(new ArrayList<Car>())
.address("schibinabi")
.sales(10000f)
.build();
car = Car.builder()
.brand("McLaren")
.maxSpeed(300)
.price(10500f)
.build();
carDealer.addCar(car);
}
@Test
void verifyFindAll(){
Iterable<CarDealer> carDealerList = carDealerRepository.findAll();
assertThat(carDealerList).isNotNull();
assertThat(carDealerList).isEmpty();
}
}
我试图使用断点,但是它甚至都没有涉及到我编写的代码。
这是Car
和CarDealer
的类
CarDealer :
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Builder
@Getter
@Setter
public class CarDealer extends AbstractPersistable<Long> {
private Float sales;
private String address;
@OneToMany(mappedBy = "cardealer",cascade = CascadeType.PERSIST)
private List<Car> cars = new ArrayList<Car>();
public void addCar(Car car) {
cars.add(car);
if(!this.equals(car.getCarDealer())){
car.setCarDealer(this);
}
}
public boolean containsCar(Car car) {
return cars.contains(car);
}
}
汽车:
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Builder
@Getter
@Setter
public class Car extends AbstractPersistable<Long> {
private String brand;
private Float price;
private Integer maxSpeed;
@ElementCollection
private List<String> versions;
@ManyToOne(cascade = CascadeType.PERSIST,fetch = FetchType.LAZY)
@JsonIgnore
private CarDealer carDealer;
public void setCarDealer(CarDealer dealer) {
this.carDealer = dealer;
if (!dealer.containsCar(this)) {
dealer.addCar(this);
}
}
}
这也是存储库接口:
@Repository
public interface CarDealerRepository extends JpaRepository<CarDealer,Long> {
}
解决方法
您应该尝试使用与Car属性相同的大小写。
所以应该是:
@OneToMany(mappedBy = "carDealer",cascade = CascadeType.PERSIST)
代替:
@OneToMany(mappedBy = "cardealer",cascade = CascadeType.PERSIST)