Κοινή χρήση τεχνολογίας

[Spring Boot] Ανάπτυξη χαρτογράφησης σχέσεων (3): χαρτογράφηση πολλά-προς-πολλά

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

JPA από την είσοδο στην επάρκεια》 Η σειρά περιλαμβάνει τα ακόλουθα άρθρα:


Ανάπτυξη χαρτογράφησης σχέσεων (3): χαρτογράφηση πολλά-προς-πολλά

υπάρχει πολλά σε πολλά Στη σχέση συσχέτισης, μόνο μέσωενδιάμεσος πίνακας Η αντιστοίχιση δεν μπορεί να επιτευχθεί με την προσθήκη ξένων κλειδιών.

σχόλιο @ManyToMany Χρησιμοποιείται για τον αποστολέα και τον παραλήπτη της σχέσης. Το τέλος αποστολής της σχέσης ορίζει τα χαρακτηριστικά πεδίου του άκρου λήψης ενός τύπου συλλογής και το άκρο λήψης της σχέσης δεν χρειάζεται να κάνει ορισμούς.

1. Δημιουργήστε οντότητες

1.1 Δημιουργία οντότητας Student

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

1.2 Δημιουργία οντότητας Teacher

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

υπάρχει πολλά σε πολλά Εδώ είναι μερικά πράγματα που πρέπει να προσέξετε στη σχέση σας:

  • Και τα δύο μέρη στη σχέση μπορούν να λειτουργήσουν ως κύριοι.
  • υπάρχει 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).

Εισαγάγετε την περιγραφή της εικόνας εδώ

2. Δημιουργήστε τεστ

Τα επίπεδα Service και Repository βρίσκονται σε "Ανάπτυξη χαρτογράφησης σχέσεων (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);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

Εκτελέστε τη δοκιμαστική τάξη μέσαελεγκτήςΠροκύπτουν τα ακόλουθα αποτελέσματα:

Εισαγάγετε την περιγραφή της εικόνας εδώ

Εισαγάγετε την περιγραφή της εικόνας εδώ
Εισαγάγετε την περιγραφή της εικόνας εδώ
Εισαγάγετε την περιγραφή της εικόνας εδώ
Εισαγάγετε την περιγραφή της εικόνας εδώ
Εισαγάγετε την περιγραφή της εικόνας εδώ

🚀 对于双向 ManyToMany 关系,注解 @ManyToMany 用于关系的发出端和接收端。另外,关系的接收端需要设置 @ManyToMany(mappedBy='集合类型发出端实体的字段名称')