ManyToMany के साथ स्प्रिंग बूट कार्य समाधान



लेख आपको रात के अंधेरे में भटकते हुए संबोधित किया गया है। आप, जिसका रास्ता केवल अकेली आग से जलाया जाता है। सामान्य तौर पर, एक प्रोग्रामर जो हाइबरनेट में स्प्रिंग बूट और कईटॉमनी संबंधों का अध्ययन करता है।

उन्होंने एक सार संगीत विषय पर एक परीक्षण कार्य किया: जावा, स्प्रिंग, हाइबरनेट का उपयोग करते हुए संगीतकारों, गीतों, एल्बमों के बारे में डेटा संग्रहीत करने के लिए एक सेवा लिखें। असाइनमेंट का हिस्सा "रचनाएँ" और "कलाकार" वर्ग का निर्माण था। एक रचना कई कलाकारों द्वारा की जा सकती है, और एक कलाकार कई रचनाएं कर सकता है। ManyToMany का विशिष्ट द्विदिश रवैया।

खासांग पाठ्यक्रमों ने सिखाया कि डीटीओ वर्ग का उपयोग करके वसंत के आसपास आराम अनुरोधों से कैसे बचा जाए, लेकिन स्प्रिंग बूट एक अलग कहानी है। रूसी-भाषा साइटों पर मैंने "हां, यह सब प्राथमिक है" जैसे उत्तर देखे, लेकिन विशिष्ट स्पष्टीकरण के बिना। मैं इस समस्या को हल करने का एक उदाहरण दूंगा। पूरा कोड जीथब पर स्थित है, नीचे लिंक है।

सबसे पहले, Entity बनाएँ: People और SongPlayers। संक्षिप्तता के लिए गेटर्स और सेटर को छोड़ दिया जाता है।

@Entity public class People { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; private String human; //      @ManyToOne(cascade = CascadeType.ALL) private RockGroups rockGroups; //     @ManyToMany(mappedBy = "songInstrumentalist",fetch = FetchType.EAGER) private List<SongPlayers> songItems; public People(){} public People(long id, String human){ this.id = id; this.human = human; } //. . . . . . . . . } 

 @Entity public class SongPlayers { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; private String song; //    private String composer; //     private String poet; //    private String album; //   //     @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) private List<People> songInstrumentalist; //. . . . . . . . . } 

फिर हम लोग वर्ग के लिए रिपॉजिटरी इंटरफेस बनाते हैं।

 @Repository public interface PeopleRepository extends JpaRepository<People, Long> { @Query("select h from People h where h.human=?1") List<People> searchByHuman(String human); List<People> findPeopleByHuman(String human); } 

और SongPlayers वर्ग के लिए

 @Repository public interface SongPlayersRepository extends JpaRepository<SongPlayers, Long> { List<SongPlayers> findSongPlayersBySong(String song); List<SongPlayers> findSongPlayersByComposer(String composer); List<SongPlayers> findSongPlayersByPoet(String poet); } 

रिपॉजिटरी एनोटेशन कंपोनेंट एनोटेशन का विस्तार करता है, जो कार्यान्वित वर्ग को सेम और तदनुसार ऑटोवेयर की अनुमति देता है।

JpaRepository इंटरफ़ेस का विस्तार आपको अतिरिक्त विवरण और अन्य उपयोगी चीजों के बिना आवश्यक CRUD संचालन करने की अनुमति देता है।

अब आपको Entity People और SongPlayers के लिए DTO कक्षाएं बनाने की आवश्यकता है। यहाँ मैं केवल PeopleDTO का हवाला दूंगा ताकि लेख को अव्यवस्थित न किया जा सके। गेटर्स और सेटर फिर से कम हो गए।

 public class PeopleDTO { private long id; private String human; private RockGroups rockGroups; private List<SongPlayersDTO> songPlayersList; public List<PeopleDTO> getPeopleDTOList(List<People> peopleList){ List<PeopleDTO> peopleDTOList = new ArrayList<>(); for (People people : peopleList){ songPlayersList = new ArrayList<>(); PeopleDTO peopleDTO = new PeopleDTO(); peopleDTO.setId(people.getId()); peopleDTO.setHuman(people.getHuman()); peopleDTO.setRockGroups(people.getRockGroups()); for (SongPlayers songPlayers : people.getSongItems()){ SongPlayersDTO songPlayersDTO = new SongPlayersDTO(); songPlayersDTO.setId(songPlayers.getId()); songPlayersDTO.setSong(songPlayers.getSong()); songPlayersDTO.setPoet(songPlayers.getPoet()); songPlayersDTO.setComposer(songPlayers.getComposer()); songPlayersDTO.setAlbum(songPlayers.getAlbum()); songPlayersList.add(songPlayersDTO); } peopleDTO.setSongPlayersList(songPlayersList); peopleDTOList.add(peopleDTO); } return peopleDTOList; } //. . . . . . . . . } 

सादृश्य द्वारा, SongPlayersDTO वर्ग भी बनाया गया है। हम शेष उत्तर में प्रदर्शित करने के लिए आवश्यक फ़ील्ड चुनते हैं।

लोगों के लिए एक नियंत्रक बनाएँ। ध्यान दें, अपने हाथों को देखें!

 @RestController @RequestMapping("/people") public class PeopleController { @Autowired private PeopleRepository repository; @GetMapping("/all") public List<PeopleDTO> getAllPeople(){ PeopleDTO peopleDTO = new PeopleDTO(); return peopleDTO.getPeopleDTOList(repository.findAll()); } //. . . . . . . } 

हाँ, आप कहते हैं। यह काम नहीं करेगा। PeopleRepository इंटरफ़ेस का कार्यान्वयन कहाँ है?
काम करेंगे, मक्खी पर PeopleRepository वर्ग बनाया गया है! बस शानदार।

अब स्प्रिंग और स्प्रिंग बूट पर एक समान परियोजना के लिए बनाई गई कक्षाओं और इंटरफेस की संख्या की तुलना करें
एक वसंत परियोजना में कक्षाएंवसंत बूट में कक्षाएं

मैं आप सभी सफल प्रोग्रामिंग की कामना करता हूं। आपकी टिप्पणियों की प्रतीक्षा है।


प्रयुक्त साहित्य:

  • फेलिप गुटिरेज प्रो स्प्रिंग बूट
  • क्रेग वॉल्स स्प्रिंग इन एक्शन 5 वें संस्करण

Source: https://habr.com/ru/post/hi432318/


All Articles