【发布时间】:2022-01-02 17:25:38
【问题描述】:
假设我们有两个实体,EntityA 和 EntityB,这些实体是双向的。我们应该如何获得entityB?向存储库添加新方法是否有意义,例如 findAllByEntityA() 或者我们可以使用 getEntitiesA() getter?
【问题讨论】:
假设我们有两个实体,EntityA 和 EntityB,这些实体是双向的。我们应该如何获得entityB?向存储库添加新方法是否有意义,例如 findAllByEntityA() 或者我们可以使用 getEntitiesA() getter?
【问题讨论】:
你可以添加一个新的 spring repo 方法,或者简单地使用 @Getter 注释,或者实现你自己的 getter 方法。
如果您希望返回 ListfindAllByEntityA() 作为获取 EntityB 的一种方式。另一方面,根据命名约定,我希望 getEntitiesA() 用于获取 List
这实际上取决于您的双向关系,但基本上所有 jpa 一对一、一对多、多对一、多对多映射都归结为外键约束.
【讨论】:
正如涡轮食品已经说过的那样。有不同种类的映射:
对于一对一映射和多对一映射,您只有一个外键。但是对于多对多映射,您有两个外键,它们是 db-relation-table 的一部分(不能有 jpa-entity)。
使用 JPA/Hibernate,我们将关系之间的端点分为两种:拥有方(getter 和 setter)和非拥有方(getter 和 setter)。
对于多对多关系,这是拥有方:
@OrderBy
@ManyToMany
@JoinTable(name="`STUDENT_TO_TEACHER`", joinColumns = {
@JoinColumn(name="`student_id`", referencedColumnName="`id`", nullable=false),
}, inverseJoinColumns = {
@JoinColumn(name="`teacher_id`", referencedColumnName="`id`", nullable=false)
})
public Set<Student> getStudents() {
return this.students;
}
以及非拥有方:
@ManyToMany(mappedBy="students")
public Set<Teacher> getTeachers() {
return teachers;
}
现在为什么拥有方和非拥有方很重要:
Student student = ...
Teacher teacher = ...
// a bad example:
student.getTeachers().add(teacher); // STUDENT.TEACHERS IS NOT THE OWNING SIDE
entityManager.persist(student); // THIS IS NOT POSSIBLE!
// a good example
teacher.getStudents().add(student); // good
entityManager.persist(teacher); // possible, teacher have a new student.
除了 Map 关联的 1-1/n-m/1-n 边之外,还有另一种罕见的映射情况。 Map 关联允许您在休眠中使用地图作为吸气剂。我从来没有使用过,所以我无法详细说明这方面的经验。
【讨论】: