моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
《JPA от вступления до мастерства》 Серия включает следующие статьи:
существовать многие ко многим В ассоциативных отношениях только черезпромежуточный стол Сопоставление не может быть достигнуто путем добавления внешних ключей.
аннотация @МногиеДляМногих Используется для отправителя и получателя отношения. Отправляющая сторона связи определяет атрибуты поля принимающей стороны типа коллекции, и принимающей стороне связи не нужно делать никаких определений.
package com.example.demo.entity;
import lombok.Data;
import javax.persistence.*;
import java.util.List;
import java.util.Set;
@Entity
@Data
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;
@Column(columnDefinition = "enum('male','female')")
private String sex;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "teacher_student", joinColumns = {@JoinColumn(name = "s_id")}, inverseJoinColumns = {@JoinColumn(name = "t_id")})
private Set<Teacher> teachers;
}
package com.example.demo.entity;
import lombok.Data;
import javax.persistence.*;
import java.util.List;
import java.util.Set;
@Data
@Entity
public class Teacher {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;
@ManyToMany(fetch = FetchType.LAZY)
/**
* Description:
* 1、关系两边都作为主控;
* 2、joinColumns 中 @JoinColumn(name="t_id") 其中 t_id 为 JoinTable 中的外键,由于 Student 和 Teacher 的主键都为 id 这边就省略 referencedColumnName="id"。
*/
@JoinTable(name = "teacher_student", joinColumns = {@JoinColumn(name = "t_id")}, inverseJoinColumns = {@JoinColumn(name = "s_id")})
private Set<Student> students;
}
существовать многие ко многим Вот некоторые вещи, на которые стоит обратить внимание в ваших отношениях:
joinColumns
из@JoinColumn(name="t_id")
середина,t_id
Является внешним ключом в JoinTable.Поскольку первичные ключи Студента и Учителя обаid
, поэтому здесь оно опущено referencedColumnName="id"
。cascade = CascadeType.PERSIST
, затем выполнение save
будет вызван, когдаonPersist()
метод.Этот метод будет рекурсивно вызывать внешний класс (Студент или Учитель).onPersist()
Выполните каскадное сложение.Но поскольку стоимость была добавлена, о ней будет сообщено.detached entity passed to persist
Ошибка, отменить каскадную операцию (удалитьcascade = CascadeType.PERSIST
).Слои Сервиса и Репозитория находятся в "Разработка карт отношений (1): сопоставление один к одному》Уже говорилось, здесь нет никакой разницы, поэтому не буду вдаваться в подробности и перейду непосредственно к написанию кода тестового слоя.
package com.example.demo.entity;
import com.example.demo.repository.StudentRepository;
import com.example.demo.repository.TeacherRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.HashSet;
import java.util.Set;
import static org.junit.Assert.*;
@SpringBootTest
@RunWith(SpringRunner.class)
public class ManyToManyTest {
@Autowired
private StudentRepository studentRepository;
@Autowired
private TeacherRepository teacherRepository;
@Test
public void add() {
Set<Teacher> teachers = new HashSet<>();
Set<Student> students = new HashSet<>();
Student student1 = new Student();
student1.setName("张三");
students.add(student1);
studentRepository.save(student1);
Student student2 = new Student();
student2.setName("李四");
students.add(student2);
studentRepository.save(student2);
Teacher teacher1 = new Teacher();
teacher1.setName("皮皮老师");
teacher1.setStudents(students);
teachers.add(teacher1);
teacherRepository.save(teacher1);
}
}
Запустите тестовый класс вконтроллерВыводятся следующие результаты:
🚀 对于双向 ManyToMany 关系,注解 @ManyToMany 用于关系的发出端和接收端。另外,关系的接收端需要设置
@ManyToMany(mappedBy='集合类型发出端实体的字段名称')
。