حل مهمة التمهيد الربيع مع ManyToMany



المقال موجه إليك ، يتجول في ظلام الليل. أنت ، الذي يضيء طريقه فقط من اليراعات وحيدا. بشكل عام ، مبرمج يدرس Spring Boot وعلاقة ManyToMany في Hibernate.

لقد قام بمهمة اختبار حول موضوع موسيقي تجريدي: كتابة خدمة لتخزين البيانات حول الموسيقيين والأغاني والألبومات باستخدام Java و Spring و Hibernate. جزء من المهمة كان إنشاء فصول "المؤلفات" و "فناني الأداء". يمكن تنفيذ العديد من المؤديين على التركيبة ، ويمكن أن يؤدي المؤدي العديد من المؤلفات. موقف ثنائي الاتجاه نموذجي من ManyToMany.

درست دورات Khasang كيفية تجنب طلبات الراحة التي تدور حول Spring باستخدام فصل DTO ، لكن Spring Boot هي قصة مختلفة. في مواقع اللغة الروسية ، رأيت إجابات مثل "نعم ، كل شيء أساسي" ، لكن بدون توضيحات محددة. سأقدم مثالا لحل هذه المشكلة. يوجد الكود الكامل في جيثب ، الرابط أدناه.

أولاً ، قم بإنشاء 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); } 

يمتد التعليق التوضيحي للمخزن من التعليق التوضيحي للمكون ، والذي يسمح للفئة المنفذة أن تكون فاصوليا وفقًا لذلك autowire.

يسمح لك امتداد واجهة JpaRepository بتنفيذ عمليات CRUD الضرورية دون وصف إضافي وأشياء أخرى مفيدة.

أنت الآن بحاجة إلى إنشاء فصول DTO لـ Entity People و SongPlayers. هنا ، سأستشهد بـ 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 على الطاير! رائع فقط

قارن الآن بين عدد الطبقات والواجهات التي تم إنشاؤها لمشروع مماثل في برنامج Spring and Spring Boot
الطبقات في مشروع الربيعالطبقات في التمهيد الربيع

أتمنى لكم جميعا البرمجة الناجحة. في انتظار تعليقاتكم.


الأدب المستخدم:

  • فيليبي جوتيريز برو ربيع الحذاء
  • كريج جدران الربيع في العمل الإصدار الخامس

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


All Articles