OneToMany с EmbeddedId возвращает ноль в тесте Spring Data JPA - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть таблицы 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;
}
...