Для отображения набора требуется идентификатор? - PullRequest
0 голосов
/ 27 февраля 2019

У меня проблема с отображением пружинных данных jdbc:
Student сущность:

@Value(staticConstructor = "of")
public class Student {

private final @Id
@Wither
long studentId;

@NotNull
@Size(min = 4, max = 20)
private String userId;

@NotNull
@Min(0)
private int matriculationNumber;

@NotNull
@Email
private String eMail;

private @Wither
Set<StudentSubjectRegistration> studentSubjectRegistrations;
}

Далее у меня есть StudentSubjectRegistration сущность:

@Value(staticConstructor = "of")
public class StudentSubjectRegistration {

@NotNull
private String electiveType;

@NotNull
private LocalDateTime created;

@NotNull
private long subjectid;
}

Когда я запускаю тест, чтобы найти одного конкретного студента, как показано здесь:

@Test
public void findOneStudent() throws InterruptedException, ExecutionException {
    long studentId = 2L;
    Future<Student> student = studentService.findById(2L);
    while (!student.isDone()) {
        Thread.sleep(100);
    }
    assertThat(student.get()).isNotNull();
    assertThat(student.get().getStudentId()).isEqualTo(studentId);
}

Консоль говорит, что выпущено одно заявление sql: Executing prepared SQL statement [SELECT student.studentid AS studentid, student.userid AS userid, student.matriculationnumber AS matriculationnumber, student.email AS email FROM student WHERE student.studentid = ?]

Что касается моего понимания, то должен быть другойВыдается SQL-запрос для извлечения связанных регистраций, не так ли?

Вместо этого происходит исключение: java.lang.IllegalStateException: Required identifier property not found for class de.thd.awp.student.StudentSubjectRegistration!

Нужно ли моделировать StudentSubjectRegistration с * 1022?*?

StudentSubjectRegistration не должно быть агрегированным корнем.Это должна быть ссылка из Student, где сохраняются его регистрации.

Я что-то упустил?

Обратите внимание, кроме того, на мои попытки смоделировать неизменность сущности, вдохновленные этим сообщением в блоге https://spring.io/blog/2018/09/27/what-s-new-in-spring-data-lovelace ...

Я все делаю правильно?

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 28 февраля 2019

Сущностям внутри агрегата нужно то, что можно назвать effective-id, который должен быть уникальным в агрегате.

В случае List и Map они создаются путем обратной ссылки на агрегаткорень и индекс / ключ List / Map.

При Set ключ, индекс или аналогичный элемент отсутствуют, поэтому необходим атрибут, помеченный @Id.

В вашем случае, subjectid звучит как многообещающий кандидат, предполагая, что Student не может зарегистрироваться на один и тот же предмет дважды.

...