gpt4 book ai didi

java - Set的映射需要Id吗?

转载 作者:太空宇宙 更新时间:2023-11-04 09:50:00 25 4
gpt4 key购买 nike

我有一个 Spring Data jdbc 映射问题,如下所示:
学生实体:

@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语句:执行准备好的 SQL 语句 [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:未找到类 de.thd.awp.student.StudentSubjectRegistration 所需的标识符属性!

我必须使用 @IdStudentSubjectRegistration 进行建模吗?

StudentSubjectRegistration 不应是聚合根。它应该是来自 Student 的引用,其中保存了其注册信息。

我错过了什么吗?

请进一步注意,受这篇博文 https://spring.io/blog/2018/09/27/what-s-new-in-spring-data-lovelace 的启发,我尝试对实体不变性进行建模。 ...

我做的事情正确吗?

感谢您的帮助!

最佳答案

聚合内的实体需要所谓的有效ID,它在聚合中必须是唯一的。

对于ListMap,它们是通过对List/Map的聚合根和索引/键的反向引用来构建的。

对于Set,没有键、索引或类似的东西,因此,需要使用@Id注释的属性。

就您而言,假设学生无法两次注册同一科目,subjectid 听起来像是一个有前途的候选者。

关于java - Set的映射需要Id吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54907804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com