Для сопоставления набора требуется идентификатор?

у меня есть проблема с отображением данных 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...

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

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

неизменяемый материал выглядит хорошо для меня.

Jens Schauder 28.02.2019 07:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
180
1

Ответы 1

Сущности внутри агрегата нуждаются в том, что можно было бы назвать 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. ... мое имя неверно?

Thomas Lang 28.02.2019 09:06

Это вариант этой ошибки: jira.spring.io/projects/DATAJDBC/issues/DATAJDBC-127, который, среди прочего, нарушает неизменяемую поддержку. Таким образом, в настоящее время вы не можете использовать Set<someEntity> в качестве аргумента конструктора.

Jens Schauder 28.02.2019 09:44

Спасибо. Я сделал следующий трюк, чтобы обойти эту проблему: @Setter private Set<StudentSubjectRegistration> studentSubjectRegistrations; внутри Student сущности.

Thomas Lang 28.02.2019 09:51

@ThomasLang Еще лучше использовать @Wither, поскольку он сохраняет неизменность. Вам понадобятся два конструктора: один со всеми аргументами. И один с несуществующими, помеченными @PersistenceContext.

Jens Schauder 05.03.2019 11:14

Другие вопросы по теме

Как получить сообщение или определенный тип исключения, работающий с RestTemplate и обработчиками исключений в приложении Spring Boot
Spring JPA Создание вопросов
Получение исключения HttpMessageNotReadableException при использовании RestTemplate для получения объекта JSON
Hibernate добавляет нежелательный столбец в таблицу, которая не отображается или не определена
Замена начального одинарного инвертированного на начальную фигурную скобку и конечного одинарного инвертированного на конечную фигурную скобку
Пусть Spring ответит 400 (вместо 500) в случае ошибки проверки заголовка запроса
Spring Batch CompositeItemProcessor получает значение от других делегатов
Почему я не могу получить доступ к службам CXF в tomcat: статус HTTP 500 — внутренняя ошибка сервера
Невозможно установить максимальное значение для «spring.servlet.multipart.max-file-size» в весенней загрузке 2
Кодировщик/декодер паролей в Spring Boot