Во время обновления моего сервиса с Spring Boot 3.1 до Spring Boot 3.2 один из моих интеграционных тестов начал давать сбой. Сначала тест создает такую структуру данных:
- parent
- child
- grandchild
- grandchild
Если я теперь использую метод репозиторий.findAll для каждого репозитория, я получу:
- Parent(id=1, type=TYPE, value=42)
- Child(id=1, parentId=1, field=value)
- Grandchild(id=1, childId=1, data=stack)
- Grandchild(id=2, childId=1, data=overflow)
Однако взгляните на этот пользовательский запрос с соединениями:
@Query(value = "SELECT * FROM grandchild gc " +
"INNER JOIN child c ON c.id = gc.child_id " +
"INNER JOIN parent p ON p.id = c.parent_id " +
"WHERE de.type = :type AND de.value = :value " +
"ORDER BY gc.id")
List findAllGrandchildren(@Param(value = "type") String type,
@Param(value = "value") String value);
Если я запущу этот запрос во время теста, я получу двух внуков, как и ожидалось, но они оба будут иметь одинаковый идентификатор (но правильные данные)?
- Grandchild(id=1, childId=1, data=stack)
- Grandchild(id=1, childId=1, data=overflow)
Если я запускаю тест вместе с другими тестами (но очищаю БД после каждого теста), я также вижу такое состояние:
- Parent(id=3, type=TYPE, value=42)
- Child(id=3, parentId=3, field=value)
- Grandchild(id=3, childId=3, data=stack)
- Grandchild(id=3, childId=3, data=overflow)
Хотя репозитарий.findAll для внуков вернулся:
- Grandchild(id=5, childId=3, data=stack)
- Grandchild(id=6, childId=3, data=overflow)
Я пытался выполнить подобный запрос, который дал тот же результат, что и findAll
@Query(value = "SELECT * FROM grandchild")
List findAllGrandchildren
Я также снова попробовал findAllGrandchildren, но вместо SELECT * я использовал SELECT gc. Я ожидал получить тот же результат, что и findAll, но получил:
- Grandchild(id=null, childId=null, data=null)
- Grandchild(id=null, childId=null, data=null)
Это меня озадачило. В чем может быть причина того, что пользовательский запрос с объединениями возвращает идентификаторы, которых нет в выходных данных репозитория.findAll?
EDIT
Родительский класс
@Data
@Builder
@AllArgsConstructor
@Table("parent")
public class Parent {
@Id
private Long id;
private String type;
private Long value;
private HashSet children;
}
Child.class
@Data
@Builder
@Accessors(chain = true)
@AllArgsConstructor
@Table("child")
public class Child {
@Id
private Long id;
private Long parentId;
private String field;
}
Внук.класс
@Data
@Builder
@AllArgsConstructor
@Table("grandchild")
public class Grandchild {
@Id
private Long id;
private Long childId;
private String data;
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... test-after
Репозиторий Spring возвращает объекты с идентификаторами, которые не должны существовать в тесте после Spring Boot 3.2. ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение