प्रौद्योगिकी साझेदारी

[Spring Boot] सम्बन्धमानचित्रणविकासः (3): बहु-बहु-मानचित्रणम्

2024-07-12

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

प्रवेशतः प्रवीणतापर्यन्तं जेपीए》 श्रृङ्खलायां निम्नलिखितलेखाः सन्ति ।


अस्ति अनेकेभ्यः बहुभ्यः सङ्गसम्बन्धे केवलं माध्यमेनमध्यवर्ती सारणी विदेशीयकीलानि योजयित्वा मानचित्रणं प्राप्तुं न शक्यते ।

टिप्पणी @ManyToMany सम्बन्धस्य प्रेषकस्य ग्राहकस्य च कृते प्रयुक्तम्। सम्बन्धस्य प्रेषकान्तः संग्रहप्रकारस्य ग्राहकान्तस्य क्षेत्रगुणान् परिभाषयति, सम्बन्धस्य ग्राहकान्तस्य च परिभाषां कर्तुं आवश्यकता नास्ति

1. सत्ताः रचयन्तु

1.1 Student entity रचयन्तु

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 शिक्षकसत्तां रचयन्तु

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 and Repository इति स्तराः " " इत्यत्र सन्ति ।सम्बन्धमानचित्रणविकासः (१): एकैकं मानचित्रणम्》पूर्वमेव उक्तं, अत्र कोऽपि भेदः नास्ति, अतः अहं विस्तरेण गत्वा प्रत्यक्षतया परीक्षणस्तरस्य कोडलेखनं न गमिष्यामि ।

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='集合类型发出端实体的字段名称')