у меня есть проблема с отображением данных jdbc spring следующим образом: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 с помощью @Id?
StudentSubjectRegistration не должен быть совокупным корнем. Это должна быть ссылка из Student, где сохранены его регистрации.
Я что-то упускаю?
Кроме того, обратите внимание на мою попытку смоделировать неизменность сущности, вдохновленную этим сообщением в блоге https://spring.io/blog/2018/09/27/what-s-new-in-spring-data-lovelace...
Я делаю все правильно?
Спасибо за вашу помощь!




Сущности внутри агрегата нуждаются в том, что можно было бы назвать effective-id, который должен быть уникальным в агрегате.
В случае List и Map они строятся по обратной ссылке на корень агрегата и индекс/ключ List/Map.
С Set нет ключа, индекса или чего-то подобного, поэтому необходим атрибут, аннотированный @Id.
В вашем случае subjectid звучит как многообещающий кандидат, если предположить, что Student не может зарегистрироваться на один и тот же предмет дважды.
Спасибо, Йенс, за помощь. Я сделал следующее: private final @Id long subjectid; в моем StudentSubjectRegistration ... Теперь консоль говорит: Caused by: org.postgresql.util.PSQLException: Der Spaltenname studentSubjectRegistrations_subjectid wurde in diesem ResultSet nicht gefunden. ... мое имя неверно?
Это вариант этой ошибки: jira.spring.io/projects/DATAJDBC/issues/DATAJDBC-127, который, среди прочего, нарушает неизменяемую поддержку. Таким образом, в настоящее время вы не можете использовать Set<someEntity> в качестве аргумента конструктора.
Спасибо. Я сделал следующий трюк, чтобы обойти эту проблему: @Setter private Set<StudentSubjectRegistration> studentSubjectRegistrations; внутри Student сущности.
@ThomasLang Еще лучше использовать @Wither, поскольку он сохраняет неизменность. Вам понадобятся два конструктора: один со всеми аргументами. И один с несуществующими, помеченными @PersistenceContext.
неизменяемый материал выглядит хорошо для меня.