У меня есть таблицы car
и season_tickers
, и я хотел бы объединить их с отношением ManyToMany
, а в присоединяемой таблице должны быть дополнительные поля. Когда код был готов, я решил проверить через @DataJpaTest
(я использую SpringBoot
и Spring Data JPA
). Основываясь на этом тесте, я вижу, что код работает неправильно, поле OneToMany
возвращает null
(см. Комментарий в тестовом коде под несостоявшимся утверждением). Вы можете помочь мне исправить это?
PS: я протестировал его на рабочем коде, и все работает нормально. Так что проблема только в @DataJpaTest
Мой тест имеет следующий вид:
@ExtendWith({SpringExtension.class})
@DataJpaTest
public class CarDaoTest {
@Autowired
private TestEntityManager testEntityManager;
@Autowired
private CarDAO carDAO;
@Test
void findCarWithSeasonTicketTest(){
SeasonTicket seasonTicket = SeasonTicket.builder()
.name("TestName")
.build();
seasonTicket = testEntityManager.persist(seasonTicket);
Car car = Car.builder()
.carNumber("someCarNumber")
.build();
car = testEntityManager.persist(car);
CarSeasonTicket carSeasonTicket = CarSeasonTicket.builder()
.car(car)
.seasonTicket(seasonTicket)
.startDate(LocalDateTime.now())
.endDate(LocalDateTime.now())
.build();
carSeasonTicket = testEntityManager.persist(carSeasonTicket);
Optional<Car> findCar = carDAO.findById(car.getId());
assertThat(findCar.isPresent()).isTrue();
Car carFromDAO = findCar.get();
// test fails in this line with message Expecting actual not to be null
assertThat(carFromDAO.getSeasonTickets()).hasSize(1);
}
}
Автомобильная сущность:
@Entity
@Table(name = "cars")
public class Car {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name="car_number", nullable = false, length = 10)
private String carNumber;
@OneToMany(mappedBy = "car", fetch = FetchType.EAGER)
private List<CarSeasonTicket> seasonTickets;
}
Объединенная сущность таблицы:
@Entity
@Table(name = "car_season_ticket")
@Data
public class CarSeasonTicket {
@EmbeddedId
@Builder.Default private CarSeasonTicketId carSeasonTicketId = new CarSeasonTicketId();
@ManyToOne(fetch = FetchType.LAZY)
@MapsId("carId")
private Car car;
@ManyToOne(fetch = FetchType.LAZY)
@MapsId("seasonTicketId")
private SeasonTicket seasonTicket;
@Column(name = "start_date")
private LocalDateTime startDate;
@Column(name = "end_date")
private LocalDateTime endDate;
}
Встраиваемый ключ:
@Embeddable
@Data
public class CarSeasonTicketId implements Serializable {
@Column(name = "car_id")
private Long carId;
@Column(name = "season_ticket_id")
private Long seasonTicketId;
}