{"id":325684,"date":"2021-06-29T15:00:54","date_gmt":"2021-06-29T15:00:54","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=325684"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=325684","title":{"rendered":"Spring boot: \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u0430\u043c\u044b\u0445 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a6e\/e80\/2b8\/a6ee802b8dd91d64ef89a373a322d990.png\" width=\"1140\" height=\"705\"><figcaption><\/figcaption><\/figure>\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0412\u0430\u0440\u0432\u0430\u0440\u0430 \u0438 \u044f Java Developer \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u201c\u0426\u0438\u0444\u0440\u043e\u0432\u044b\u0435 \u043f\u0440\u0438\u0432\u044b\u0447\u043a\u0438\u201d. \u042f \u043f\u0440\u043e\u0448\u043b\u0430 \u0438\u0445 \u043a\u0443\u0440\u0441 \u043f\u043e Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438 \u043f\u043e \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430 &nbsp;\u043e\u0444\u0444\u0435\u0440 \u043e\u0442 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438. \u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c \u0441 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0432\u043e\u0440\u043a\u0448\u043e\u043f\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043c \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b \u043e\u0434\u0438\u043d \u0438\u0437 \u043b\u0435\u043a\u0442\u043e\u0440\u043e\u0432 &#8212; \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u0420\u043e\u043c\u0430\u043d\u043e\u0432, Software Architect \u0438 \u043f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u0435\u043b\u044c \u0411\u0430\u0443\u043c\u0430\u043d\u043a\u0438.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043c\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u0435 REST \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0441\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c SpringBoot, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u0432\u043e\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b, \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f JPA, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c PostgreSQL.<\/p>\n<p>    \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 3 \u044d\u0442\u0430\u043f\u0430:<\/p>\n<ol>\n<li>\n<p> \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0435 REST \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 SpringBoot<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c\u0438, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c JPA<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0438 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0438 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0443\u0434\u0438\u0432\u0438\u043c\u0441\u044f, \u0447\u0442\u043e \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 \u043f\u043e\u0440\u0430\u0434\u0443\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u0432\u0440\u0435\u043c\u044f \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0439 \u0438 \u0443\u0437\u043d\u0430\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043d\u043e\u0432\u043e\u0435<\/p>\n<\/li>\n<\/ol>\n<h3>    1. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0435 REST \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 SpringBoot<\/h3>\n<p>\u041c\u044b \u043f\u043e\u0439\u0434\u0435\u043c \u043f\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u043c\u0443 \u043f\u0443\u0442\u0438, \u0430 \u0442\u043e\u0447\u043d\u0435\u0435 \u0437\u0430\u0439\u0434\u0435\u043c \u043d\u0430 \u0441\u0430\u0439\u0442-\u0441\u0442\u0430\u0440\u0442\u0435\u0440 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043d\u0430 SpringBoot: <a href=\"https:\/\/start.spring.io\/\" rel=\"noopener noreferrer nofollow\"><u>https:\/\/start.spring.io\/<\/u><\/a>. \u0412\u044b\u0431\u0435\u0440\u0435\u043c \u0441\u0431\u043e\u0440\u043a\u0443 gradle + Java. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0438 \u0441\u043e\u0431\u0435\u0440\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0438 \u0436\u0434\u0435\u043c \u043f\u043e\u043a\u0430 \u043f\u043e\u0433\u0434\u0440\u0443\u0437\u044f\u0442\u0441\u044f \u0432\u0441\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043a\u0438 \u0438 \u0441\u043e\u0431\u0435\u0440\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0435\u043a\u0442.<\/p>\n<p>    <strong><em>.\/gradlew wrapper <\/em><\/strong>&#8212; \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0443\u0436\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 wrapper.<\/p>\n<p>    <strong><em>.\/gradlew clean build bootRun<\/em><\/strong> &#8212; \u0441\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043f\u0440\u043e\u0433\u043e\u043d unit-\u0442\u0435\u0441\u0442\u043e\u0432, \u0437\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0443\u0442\u0438\u043b\u0438\u0442\u0443 <strong><em>gradlew <\/em><\/strong>(\u043f\u043e \u0441\u0443\u0442\u0438 \u044d\u0442\u043e \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 gradle), \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0438\u043c\u0435\u0442\u044c \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 Gradle \u043d\u0430 \u0441\u0432\u043e\u0435\u043c \u041f\u041a. \u042d\u0442\u0430 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0441\u0430\u043c\u0430 \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e, \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438. \u041f\u043e \u0441\u0443\u0442\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f gradlew, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0442\u044c\/\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u0441\u043e \u0432\u0441\u0435\u043c\u0438, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u0432\u0435\u0440\u0441\u0438\u044e \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c Gradle. Gradlew \u0447\u0438\u0442\u0430\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 <strong><em>gradle\/wrapper\/gradle-wrapper.properties<\/em><\/strong>.<\/p>\n<p>\u041c\u044b \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043d\u043e \u043f\u043e\u043a\u0430 \u043e\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f, \u043d\u043e \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u0417\u0430\u0445\u043e\u0434\u0438\u043c \u0432 \u0444\u0430\u0439\u043b <strong><em>build.gradle<\/em><\/strong>, \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u043c\u043e\u0437\u0433 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0417\u0434\u0435\u0441\u044c \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.&nbsp; \u0421\u0435\u0439\u0447\u0430\u0441 \u043e\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"java\">plugins {   id 'java'   id 'org.springframework.boot' version '2.5.1'   id 'io.spring.dependency-management' version '1.0.11.RELEASE' }  group = 'ru.dhabits.spring_boot_example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8'  repositories {   mavenCentral() }  dependencies {   implementation 'org.springframework.boot:spring-boot-starter'   testImplementation 'org.springframework.boot:spring-boot-starter-test' }  test {   useJUnitPlatform() }<\/code><\/pre>\n<p>\u0420\u0430\u0437\u0434\u0435\u043b <strong><em>plugins <\/em><\/strong>\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u043b\u0430\u0433\u0438\u043d\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438 \u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,<strong><em> id &#8216;java&#8217;<\/em><\/strong> &#8212; \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0430\u043c\u043e\u0439 java, \u0431\u0435\u0437 \u043d\u0435\u0435 \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u043e\u043e\u0431\u0449\u0435. \u0420\u0430\u0437\u0434\u0435\u043b <strong><em>repositories<\/em><\/strong> &#8212; \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0440\u0435\u0441\u0443\u0440\u0441 \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0443\u0442 \u0441\u043a\u0430\u0447\u0430\u043d\u044b \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u044d\u0442\u043e mavenCentral. <strong><em>dependencies <\/em><\/strong>&#8212; \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043d\u0430\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u0441\u0442\u0430\u0440\u0442\u0435\u0440\u044b SpringBoot. <strong><em>test <\/em><\/strong>&#8212; \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043f\u0440\u043e\u0433\u043e\u043d\u0430 \u0442\u0435\u0441\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d JUnit. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b <strong><em>group<\/em><\/strong>, <strong><em>version <\/em><\/strong>\u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0437\u0430 \u0433\u0440\u0443\u043f\u043f\u0443 \u0438 \u0432\u0435\u0440\u0441\u0438\u044e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0430<strong><em> sourceCompatibility<\/em><\/strong> &#8212; \u0432\u0435\u0440\u0441\u0438\u044e java.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432 dependencies \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 PEST API:<\/p>\n<pre><code class=\"java\">implementation \"org.springframework.boot:spring-boot-starter-web\"<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c&nbsp; \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 &#8212; \u043a\u043b\u0430\u0441\u0441 \u0441 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439 <em>@RestController<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043c\u0435\u0435\u0442 \u0447\u0442\u043e-\u0442\u043e \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u043c\u0443 \u043f\u043e\u043b\u0435 \u0438 \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044f.<\/p>\n<pre><code class=\"java\">@RestController public class controller {     @Value(\"${spring.application.name}\")    private String name;     @GetMapping    public String getNameApplication() {        return name;    } }<\/code><\/pre>\n<p><strong><em>@RestController<\/em><\/strong> = @Controller + @ResponseBody. \u0410\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f <strong><em>@Controller <\/em><\/strong>\u0443\u043c\u0435\u0435\u0442 \u0441\u043b\u0443\u0448\u0430\u0442\u044c, \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u044b. \u0410 <strong><em>@ResponseBody<\/em><\/strong>&nbsp; \u0434\u0430\u0435\u0442 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0443 \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u0430 \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0433\u043d\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 HttpMessageConverter, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u043e\u0435 \u043a \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435.<\/p>\n<p><strong><em>@Value(&#171;${spring.application.name}&#187;)<\/em><\/strong> &#8212; \u0443\u043c\u0435\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0437 application.properties \u0444\u0430\u0439\u043b\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <strong><em>${}<\/em><\/strong>. <strong><em>@GetMapping<\/em><\/strong> &#8212; \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 SpringBoot, \u0447\u0442\u043e \u044d\u0442\u043e get \u043c\u0435\u0442\u043e\u0434 \u0438 \u043e\u043d \u0443\u043c\u0435\u0435\u0442 \u0447\u0442\u043e-\u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c.<\/p>\n<p>\u0412 \u0444\u0430\u0439\u043b <em>application.properties<\/em> \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u0442\u0440\u043e\u043a\u0443:&nbsp;<\/p>\n<pre><code class=\"java\">spring.application.name=spring_boot_example<\/code><\/pre>\n<p>\u0412\u0443\u0430\u043b\u044f! \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f, \u043d\u043e \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 &#171;spring_boot_example&#187; \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443: <a href=\"http:\/\/localhost:8080\/\" rel=\"noopener noreferrer nofollow\"><u>http:\/\/localhost:8080\/<\/u><\/a>.<\/p>\n<h3>    2. \u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c\u0438, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c JPA<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043c JPA, \u043f\u0430\u0440\u0443 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0434\u043b\u044f \u043d\u0438\u0445 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b.<\/p>\n<h4>    2.1. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0438 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439<\/h4>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u0447\u0442\u043e\u0431 \u0432\u0441\u0435 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e &#8212; \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a \u0432 <em>build.gradle<\/em>. Data-jpa \u0438 postgresql &#8212; \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043d\u0430\u0431\u043e\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0411\u0414, \u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0441 Postgre. Lombok \u0438 lang3 \u0443\u043f\u0440\u043e\u0449\u0430\u044e\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 POJO (Plain Old Java Object \u2014 \u00ab\u0441\u0442\u0430\u0440\u044b\u0439 \u0434\u043e\u0431\u0440\u044b\u0439 Java-\u043e\u0431\u044a\u0435\u043a\u0442\u00bb), \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u043e\u0434.<\/p>\n<p>&nbsp;\u0410\u043d\u043d\u043e\u0442\u0438\u0440\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"java\">@Getter @Setter @Accessors(chain = true) @Entity @Table(name = \"address\")<\/code><\/pre>\n<p>&nbsp;    \u0410\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438: <strong><em>@Getter<\/em><\/strong> \u0438 <strong><em>@Setter<\/em><\/strong> \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442 get \u0438 set \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044f. <strong><em>@Accessors(chain = true)<\/em><\/strong> &#8212; \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0447\u0442\u043e \u0441\u0435\u0442\u0442\u0435\u0440 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0441\u0435\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044f. <strong><em>@Entity<\/em><\/strong> &#8212; \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 &#8212; \u044d\u0442\u043e POJO \u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 JPA \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0443 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u0438\u0437 <strong><em>@Table<\/em><\/strong>. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043c\u044f \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 <strong><em>@Column<\/em><\/strong>. \u0414\u043b\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b <em>User <\/em>\u043f\u043e\u043b\u0435 <em>login <\/em>&#8212; \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e \u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c null, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b <strong><em>nullable = false<\/em><\/strong>,<strong><em> unique = true<\/em><\/strong>.<\/p>\n<p>&nbsp;    \u041f\u043e\u043b\u0435 <em>Address <\/em>\u0432 \u043a\u043b\u0430\u0441\u0441\u0435 <em>User <\/em>\u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"java\">@OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = \"address_id\", foreignKey = @ForeignKey(name = \"fk_users_address_id\")) private Address address;<\/code><\/pre>\n<p>\u0410\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f <strong><em>@OneToOne<\/em><\/strong> &#8212; \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0441\u0432\u044f\u0437\u044c \u0442\u0430\u0431\u043b\u0438\u0446 \u043e\u0434\u0438\u043d \u043a \u043e\u0434\u043d\u043e\u043c\u0443, \u0430 <strong><em>fetch = FetchType.LAZY<\/em><\/strong> \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u044d\u0442\u043e \u043b\u0435\u043d\u0438\u0432\u0430\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f. \u0422\u043e \u0435\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b address \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u043a\u043b\u044e\u0447\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430 \u043a \u043d\u0438\u043c \u043e\u0431\u0440\u0430\u0442\u044f\u0442\u0441\u044f. <strong><em>@JoinColumn<\/em><\/strong> &#8212; \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0442\u0430\u0431\u043b\u0438\u0446\u0435 address. <strong><em>name = &#171;address_id&#187;<\/em><\/strong> &#8212; \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430, \u0430 <strong><em>foreignKey = @ForeignKey(name = &#171;fk_users_address_id&#187;)<\/em><\/strong> &#8212; \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e. \u041f\u0438\u0441\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u0430 \u0434\u043b\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c <strong><em>(fk_users_address_id)<\/em><\/strong> \u0443\u0434\u043e\u0431\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u043a\u0430\u043a\u0438\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u0438 \u043a\u0430\u043a.<\/p>\n<p>&nbsp;    \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b <em>hashCode<\/em>, <em>equals <\/em>\u0438 <em>toString<\/em>. \u0414\u043b\u044f <em>User <\/em>\u043c\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c hashCode \u0438 equals \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u043f\u043e\u043b\u044e <em>login<\/em>, \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u044d\u0442\u043e \u043f\u043e\u043b\u0435 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0438 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u043c \u043e\u0442 null. \u0422\u0430\u043a \u0436\u0435 \u0434\u043b\u044f <em>User <\/em>\u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 toString \u043c\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u043e\u043b\u0435 <em>address<\/em>. \u0420\u0430\u043d\u0435\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043b\u0435\u043d\u0438\u0432\u0430\u044f, \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u043d\u0435 \u043f\u043e\u0434\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443, \u0430 \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a hibernate \u0438 \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0431\u0435\u0437 @Transactional, \u0442\u043e \u0443\u043f\u0430\u0434\u0435\u043c \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439.<\/p>\n<p>&nbsp;&nbsp;    \u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439:<\/p>\n<p>&nbsp;    \u0421\u0443\u0449\u043d\u043e\u0441\u0442\u044c User:<\/p>\n<pre><code class=\"java\">@Getter @Setter @Accessors(chain = true) @Entity @Table(name = \"users\") public class User {     @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Integer id;     @Column(name = \"login\",nullable = false, unique = true)    private String login;     @Column(name = \"firstName\")    private String firstName;     @Column(name = \"middleName\")    private String middleName;     @Column(name = \"lastName\")    private String lastName;     @Column(name = \"age\")    private Integer age;     @OneToOne(fetch = FetchType.LAZY)    @JoinColumn(name = \"address_id\", foreignKey = @ForeignKey(name = \"fk_users_address_id\"))    private Address address;     @Override    public boolean equals(Object o) {        if (this == o) return true;        if (o == null || getClass() != o.getClass()) return false;        User user = (User) o;        return login.equals(user.login);    }     @Override    public int hashCode() {        return Objects.hash(login);    }     @Override    public String toString() {        return \"User{\" +                \"id=\" + id +                \", login='\" + login + '\\'' +                \", firstName='\" + firstName + '\\'' +                \", middleName='\" + middleName + '\\'' +                \", lastName='\" + lastName + '\\'' +                \", age=\" + age +                '}';    } }<\/code><\/pre>\n<p>\u0421\u0443\u0449\u043d\u043e\u0441\u0442\u044c Address:<\/p>\n<pre><code class=\"java\">\t @Getter @Setter @Accessors(chain = true) @Entity @Table(name = \"address\") public class Address {     @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Integer id;     @Column(name = \"street\")    private String street;     @Column(name = \"city\")    private String city;     @Column(name = \"building\")    private String building;     @Override    public boolean equals(Object o) {        if (this == o) return true;        if (o == null || getClass() != o.getClass()) return false;        Address address = (Address) o;        return street.equals(address.street) &amp;&amp; city.equals(address.city) &amp;&amp; building.equals(address.building);    }     @Override    public int hashCode() {        return Objects.hash(street, city, building);    }     @Override    public String toString() {        return \"Address{\" +                \"id=\" + id +                \", street='\" + street + '\\'' +                \", city='\" + city + '\\'' +                \", building='\" + building + '\\'' +                '}';    } }<\/code><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u2013 \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043c\u0435\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u0430, \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u0432\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438 \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u0435\u0433\u043e \u043e\u0442 <em>JpaRepository<\/em>. \u0412\u0441\u0435. SpringBoot \u0441\u0430\u043c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043b\u0430\u0441\u0441, \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u044d\u0442\u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442 \u0442\u0430\u043c, \u0433\u0434\u0435 \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e.<\/p>\n<pre><code class=\"java\">public interface UserRepository extends JpaRepository&lt;User, Integer&gt; {}<\/code><\/pre>\n<p><strong><em>JpaRepository<\/em><\/strong> \u2013 \u044d\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 Spring Data \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u043d\u0430\u0431\u043e\u0440 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 JPA \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0411\u0414.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 MVC \u043c\u043e\u0434\u0435\u043b\u044c\u044e \u043b\u043e\u0433\u0438\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 2 \u0447\u0430\u0441\u0442\u0438. \u041a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043c\u0435\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0410 \u0442\u0430\u043a\u0436\u0435 \u0441\u0435\u0440\u0432\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0432\u0435\u0441\u044c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b. \u0412 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0435\u0441\u0442\u044c \u0442\u0440\u0435\u0442\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c &#8212; \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0411\u0414. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043c\u043e\u0434\u0443\u043b\u0435\u0439.<\/p>\n<h4>    2.2. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b.<\/h4>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c 4 \u043c\u043e\u0434\u0435\u043b\u0438 (<em>UserResponse<\/em>, <em>AddressResponse<\/em>, <em>CreateAddressRequest <\/em>\u0438 <em>CreateUserRequest<\/em>) &#8212; \u043a\u043b\u0430\u0441\u0441\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0430\u0448\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b. \u041c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0438 \u0434\u0432\u0443\u043c\u044f, \u043d\u043e \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u0432\u0441\u0435 \u043f\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c. \u041e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u043e\u043c\u0435\u043d\u043d\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0430\u0440\u0443\u0436\u0443 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043b\u043e\u0445\u0438\u043c \u0442\u043e\u043d\u043e\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u0442\u043a\u0440\u043e\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0411\u0414, \u043a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0441\u0432\u043e\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0440\u043e\u0449\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043d\u0438\u0445 \u043b\u044e\u0431\u043e\u0439 \u043e\u0431\u044a\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438.&nbsp;<\/p>\n<pre><code class=\"java\">@Data @Accessors(chain = true) public class UserResponse {    private Integer id;    private String login;    private String firstName;    private String middleName;    private String lastName;    private Integer age;    private AddressResponse address; }  @Data @Accessors(chain = true) public class AddressResponse {    private String street;    private String city;    private String building; }  @Data @Accessors(chain = true) public class CreateUserRequest {    private Integer id;    private String login;    private String firstName;    private String middleName;    private String lastName;    private Integer age;    private CreateAddressRequest address; }  @Data @Accessors(chain = true) public class CreateAddressRequest {    private String street;    private String city;    private String building; }<\/code><\/pre>\n<p>\u0410\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f <strong><em>@Data<\/em><\/strong> \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 get, set, toString, equals, hashCode, \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043f\u043e \u0432\u0441\u0435\u043c \u043f\u043e\u043b\u044f\u043c, \u0442.\u0435. \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 POJO \u043a\u043b\u0430\u0441\u0441.&nbsp;<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0430\u0448 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440. \u041f\u043e\u043c\u0435\u0447\u0430\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u043c\u0438 <em>@RestController<\/em> \u0438 <em>@RequestMapping(&#171;\/api\/v1\/users&#187;)<\/em>.&nbsp;&nbsp;<\/p>\n<pre><code class=\"java\">@RestController @RequestMapping(\"\/api\/v1\/users\") @RequiredArgsConstructor public class UserController {    private UserService userService; }<\/code><\/pre>\n<p><strong><em>@RequestMapping<\/em><\/strong> \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u043f\u043e \u043a\u0430\u043a\u043e\u043c\u0443 URL \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043d\u0430\u0448\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b. <strong><em>@RequiredArgsConstructor<\/em><\/strong> &#8212; \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438.<\/p>\n<p>\u0423 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 5 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432. \u0414\u0432\u0430 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445: \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u043f\u043e id, \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435.<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439:    <\/p>\n<pre><code class=\"java\">@GetMapping(produces = APPLICATION_JSON_VALUE) public List&lt;UserResponse&gt; findAll() {    return userService.findAll(); }<\/code><\/pre>\n<p>\u041d\u0430 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e <em>@GetMapping<\/em> \u043c\u044b \u0443\u0436\u0435 \u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0440\u0430\u043d\u0435\u0435. <strong><em>\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u043e produces = APPLICATION_JSON_VALUE<\/em><\/strong> \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 json. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u043c\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043b\u0438\u0441\u0442 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 <em>UserResponse<\/em>.<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e id:<\/p>\n<pre><code class=\"java\">@GetMapping(value = \"\/{userId}\", produces = APPLICATION_JSON_VALUE) public UserResponse findById(@PathVariable Integer userId) {    return userService.findById(userId); }<\/code><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u0435\u043d \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c\u0443, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c id \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0410\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f <strong><em>@PathVariable <\/em><\/strong>\u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c \u0447\u0442\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0430\u0434\u0440\u0435\u0441\u0430 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u0443\u044e \u0432 <strong><em>{}<\/em><\/strong>.&nbsp;<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f:<\/p>\n<pre><code class=\"java\">@PostMapping(consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) public UserResponse create(@RequestBody CreateUserRequest request) {    return userService.createUser(request); }<\/code><\/pre>\n<p><strong><em>@PostMapping<\/em><\/strong> \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442, \u0447\u0442\u043e \u044d\u0442\u043e post \u043c\u0435\u0442\u043e\u0434 \u0438 \u043e\u043d \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u0435\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0411\u0414. <strong><em>consumes = APPLICATION_JSON_VALUE<\/em><\/strong> &#8212; \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 json.<\/p>\n<p>\u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e id:<\/p>\n<pre><code class=\"java\">@PatchMapping(value = \"\/{userId}\", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) public UserResponse update(@PathVariable Integer userId, @RequestBody CreateUserRequest request) {    return userService.update(userId, request); }<\/code><\/pre>\n<p><strong><em>@PatchMapping<\/em><\/strong> &#8212; patch \u043c\u0435\u0442\u043e\u0434 \u0432\u043d\u043e\u0441\u0438\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438<\/p>\n<p>\u0423\u0434\u0430\u043b\u044f\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e id:<\/p>\n<pre><code class=\"java\">@ResponseStatus(HttpStatus.NO_CONTENT) @DeleteMapping(value = \"\/{userId}\", produces = APPLICATION_JSON_VALUE) public void delete(@PathVariable Integer userId) {    userService.delete(userId); }<\/code><\/pre>\n<p><strong><em>@DeleteMapping<\/em><\/strong> &#8212; delete \u043c\u0435\u0442\u043e\u0434 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u0438. <strong><em>@ResponseStatus(HttpStatus.NO_CONTENT)<\/em><\/strong> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0430\u0442\u0443\u0441, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0432 \u0441\u043a\u043e\u0431\u043a\u0430\u0445 \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430.&nbsp;<\/p>\n<h4>    2.3. \u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/h4>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043b\u043e\u0433\u0438\u043a\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u0430. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441 \u043f\u044f\u0442\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438, \u0430 \u0437\u0430\u0442\u0435\u043c \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u0441\u044f \u043e\u0442 \u043d\u0435\u0433\u043e. \u041d\u0430\u0448 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"java\">public interface UserService {     @NotNull    List&lt;UserResponse&gt; findAll();     @NotNull    UserResponse findById(@NotNull Integer userId);     @NotNull    UserResponse createUser(@NotNull CreateUserRequest request);     @NotNull    UserResponse update(@NotNull Integer userId, @NotNull CreateUserRequest request);     void delete(@NotNull Integer userId); }<\/code><\/pre>\n<p>\u0410\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f <strong><em>@NotNull<\/em><\/strong> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0434\u0432\u0443\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445. \u0412 \u043f\u0435\u0440\u0432\u043e\u043c &#8212; \u043d\u0430\u0434 \u043c\u0435\u0442\u043e\u0434\u043e\u043c, \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c &#8212; \u0441 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439, \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c null.&nbsp;<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441:<\/p>\n<pre><code class=\"java\">@Service @RequiredArgsConstructor public class UserServiceImpl implements UserService {    private static UserRepository userRepository;     @NotNull    @Override    @Transactional(readOnly = true)    public List&lt;UserResponse&gt; findAll() {        return null;    }     @NotNull    @Override    @Transactional(readOnly = true)    public UserResponse findById(@NotNull Integer userId) {        return null;    }     @NotNull    @Override    @Transactional    public UserResponse createUser(@NotNull CreateUserRequest request) {        return null;    }     @NotNull    @Override    @Transactional    public UserResponse update(@NotNull Integer userId, @NotNull CreateUserRequest request) {        return null;    }     @Override    @Transactional    public void delete(@NotNull Integer userId) {        return null;    }<\/code><\/pre>\n<p>\u0421\u0430\u043c \u043a\u043b\u0430\u0441\u0441 \u0430\u043d\u043d\u043e\u0442\u0438\u0440\u043e\u0432\u0430\u043d <strong><em>@Service<\/em><\/strong>. \u041d\u0430\u0434 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c <strong><em>@Transactional<\/em><\/strong> &#8212; \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u043a\u0430\u043a \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438. \u0414\u043b\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0442\u0430\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435, \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0444\u043b\u0430\u0436\u043e\u043a <strong><em>readOnly = true<\/em><\/strong>.<\/p>\n<p>&nbsp;\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043b\u043e\u0433\u0438\u043a\u0443 \u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u043c\u0435\u0442\u043e\u0434.<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439:<\/p>\n<pre><code class=\"java\">public List&lt;UserResponse&gt; findAll() {    return userRepository.findAll()            .stream()            .map(this::buildUserResponse)            .collect(Collectors.toList()); }  @NotNull private UserResponse buildUserResponse(@NotNull User user) {    return new UserResponse()            .setId(user.getId())            .setLogin(user.getLogin())            .setAge(user.getAge())            .setFirstName(user.getFirstName())            .setMiddleName(user.getMiddleName())            .setLastName(user.getLastName())            .setAddress(new AddressResponse()                    .setCity(user.getAddress().getCity())                    .setBuilding(user.getAddress().getBuilding())                    .setStreet(user.getAddress().getStreet())); }<\/code><\/pre>\n<p><strong><em>userRepository.findAll<\/em><\/strong> &#8212; \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 jpa, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442, \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u0442\u0438\u043f\u0430 user, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u043c\u0438 \u0440\u0430\u043d\u0435\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043c <em>build <\/em>\u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439.<\/p>\n<p>\u0425\u043e\u0447\u0443 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0440\u0430\u043d\u044c\u0448\u0435 \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 address \u0432\u043d\u0435 @Transactional \u043c\u0435\u0442\u043e\u0434\u0430, \u0442\u043e \u0443\u043f\u0430\u0434\u0435\u043c \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439. \u0422\u0430\u043a \u0432\u043e\u0442, \u0442\u0443\u0442 \u0442\u0430\u043a\u043e\u0435 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442, \u0442.\u043a. \u043c\u0435\u0442\u043e\u0434 \u043a\u0430\u043a \u0440\u0430\u0437 \u0438\u043c\u0435\u0435\u0442 \u044d\u0442\u0443 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e, hibernate \u0435\u0435 \u0432\u0438\u0434\u0438\u0442 \u0438 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442 \u044d\u0442\u043e \u043f\u043e\u043b\u0435 \u0438\u0437 \u0411\u0414.<\/p>\n<p>&nbsp;\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e id:<\/p>\n<pre><code class=\"java\">public UserResponse findById(@NotNull Integer userId) {    return userRepository.findById(userId)            .map(this::buildUserResponse)            .orElseThrow(() -&gt; new EntityNotFoundException(\"User \" + userId + \" is not found\")); }<\/code><\/pre>\n<p><strong><em>userRepository.findById<\/em><\/strong> &#8212; \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u0435\u043d <em>findAll<\/em>, \u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 1 \u043e\u0431\u044a\u0435\u043a\u0442, \u0430 \u043d\u0435 \u0441\u043f\u0438\u0441\u043e\u043a. \u0422.\u043a. \u0438\u0437 \u0411\u0414 \u043d\u0430\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 <em>Optional<\/em>, \u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u0432\u044b\u0431\u0440\u043e\u0441\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443 <em>EntityNotFoundException<\/em>. (\u0434\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0441\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438)&nbsp;<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f:<\/p>\n<pre><code class=\"java\">public UserResponse createUser(@NotNull CreateUserRequest request) {    User user = buildUserRequest(request);    return buildUserResponse(userRepository.save(user)); }  @NotNull private User buildUserRequest(@NotNull CreateUserRequest request) {    return new User()            .setLogin(request.getLogin())            .setAge(request.getAge())            .setFirstName(request.getFirstName())            .setMiddleName(request.getMiddleName())            .setLastName(request.getLastName())            .setAddress(new Address()                    .setCity(request.getAddress().getCity())                    .setBuilding(request.getAddress().getBuilding())                    .setStreet(request.getAddress().getStreet())); }<\/code><\/pre>\n<p>\u041f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 <em>buildUserResponse <\/em>\u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <em>buildUserRequest<\/em>.&nbsp;<\/p>\n<p>\u0422\u0443\u0442 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u0434\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0443 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 <em>User <\/em>\u0435\u0441\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c <em>address<\/em>. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 address \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f, \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e \u0432\u044b\u043b\u0435\u0442\u0438\u0442 \u043e\u0448\u0438\u0431\u043a\u0430 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043d\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431 \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0432 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e <em>@OneToOne<\/em>, \u0434\u043b\u044f \u043f\u043e\u043b\u044f <em>address <\/em>\u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <em>cascade = CascadeType.ALL<\/em>. <strong><em>CascadeType.ALL<\/em><\/strong> &#8212; \u044d\u0442\u043e\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 <em>User <\/em>\u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0438 \u043d\u0430 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c <em>Address<\/em>.<\/p>\n<pre><code class=\"java\">@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumn(name = \"address_id\", foreignKey = @ForeignKey(name = \"fk_users_address_id\")) private Address address;<\/code><\/pre>\n<p>\u042d\u0442\u043e \u043d\u0435 \u0441\u0430\u043c\u044b\u0439 \u043b\u0443\u0447\u0448\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0441\u0432\u043e\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b \u0438 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438. \u041d\u043e \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f <em>Address <\/em>\u0438 <em>User <\/em>\u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u043f\u0440\u0438\u0435\u043c\u043e\u043c.<\/p>\n<p>\u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e id:<\/p>\n<pre><code class=\"java\">public UserResponse update(@NotNull Integer userId, @NotNull CreateUserRequest request) {    User user =  userRepository.findById(userId)            .orElseThrow(() -&gt; new EntityNotFoundException(\"User \" + userId + \" is not found\"));    userUpdate(user, request);    return buildUserResponse(userRepository.save(user)); }<\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u043c\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u043c <em>findById<\/em>, \u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0430\u0448\u0435\u043b\u0441\u044f, \u0442\u043e \u0441\u0435\u0442\u0438\u043c \u0435\u043c\u0443 \u043f\u043e\u043b\u044f \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <em>userUpdate<\/em>.<\/p>\n<pre><code class=\"java\">private void userUpdate(@NotNull User user, @NotNull CreateUserRequest request) {    ofNullable(request.getLogin()).map(user::setLogin);    ofNullable(request.getFirstName()).map(user::setFirstName);    ofNullable(request.getMiddleName()).map(user::setMiddleName);    ofNullable(request.getLastName()).map(user::setLastName);    ofNullable(request.getAge()).map(user::setAge);     CreateAddressRequest addressRequest = request.getAddress();    if (addressRequest != null) {        ofNullable(addressRequest.getBuilding()).map(user.getAddress()::setBuilding);        ofNullable(addressRequest.getStreet()).map(user.getAddress()::setStreet);        ofNullable(addressRequest.getCity()).map(user.getAddress()::setCity);    } }<\/code><\/pre>\n<p>\u0423\u0434\u0430\u043b\u044f\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e id:<\/p>\n<pre><code class=\"java\">public void delete(@NotNull Integer userId) {    userRepository.deleteById(userId); }<\/code><\/pre>\n<p>userRepository.deleteById &#8212; \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0434\u0430\u043b\u0438\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0411\u0414.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043e\u0448\u0438\u0431\u043e\u043a. Spring \u0443\u043c\u0435\u0435\u0442 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0438\u0445 \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u043c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442 <strong><em>ExceptionResponse<\/em><\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438\u0437 \u043e\u0448\u0438\u0431\u043a\u0438.<\/p>\n<pre><code class=\"java\">@Data public class ExceptionResponse {    private final String massage; }<\/code><\/pre>\n<p>\u0410 \u0434\u0430\u043b\u044c\u0448\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 &#8212; \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043e\u0448\u0438\u0431\u043e\u043a.&nbsp;<\/p>\n<pre><code class=\"java\">@RestControllerAdvice public class ExceptionController {     @ResponseStatus(HttpStatus.NOT_FOUND)    @ExceptionHandler(EntityNotFoundException.class)    private ExceptionResponse notFound(EntityNotFoundException ex) {        return new ExceptionResponse(ex.getMessage());    }     @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)    @ExceptionHandler(RuntimeException.class)    private ExceptionResponse error(RuntimeException ex) {        return new ExceptionResponse(ex.getMessage());    } }<\/code><\/pre>\n<p>\u0410\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f <strong><em>@ExceptionHandler<\/em><\/strong> \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0432 \u0441\u043a\u043e\u0431\u043a\u0430\u0445. <strong><em>@ResponseStatus<\/em><\/strong> \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u043a \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u043e\u0442\u0432\u0435\u0442\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: HttpStatus.NOT_FOUND &#8212; 404, \u0430 HttpStatus.INTERNAL_SERVER_ERROR &#8212; 500.<\/p>\n<h3>3. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0438 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0443\u0434\u0438\u0432\u0438\u043c\u0441\u044f \u0447\u0442\u043e \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 \u043f\u043e\u0440\u0430\u0434\u0443\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u0432\u0440\u0435\u043c\u044f \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0439 \u0438 \u0443\u0437\u043d\u0430\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043d\u043e\u0432\u043e\u0435.<\/h3>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u0440\u0435\u0434\u044b \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0411\u0414 \u0432 application.properties:<\/p>\n<pre><code class=\"xml\">spring.datasource.url=jdbc:postgresql:\/\/localhost:5432\/spring_demo spring.datasource.username=program spring.datasource.password=test spring.datasource.driver-class-name=org.postgresql.Driver spring.jpa.hibernate.ddl-auto=update spring.jpa.generate-ddl=true<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u043c \u0431\u0430\u0437\u0443 (\u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0434\u043e\u043a\u0435\u0440) \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0438 \u0432 \u0411\u0414.<\/p>\n<pre><code class=\"sql\">CREATE DATABASE spring_demo; CREATE ROLE program WITH PASSWORD 'test'; GRANT ALL PRIVILEGES ON DATABASE spring_demo TO program; ALTER ROLE program WITH LOGIN;<\/code><\/pre>\n<p>\u0423\u0440\u0430! \u041d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0442\u0435\u043f\u0435\u0440\u044c \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>\u041f\u043e\u0434\u0432\u0435\u0434\u0435\u043c \u0438\u0442\u043e\u0433. \u041c\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0436\u043d\u044b\u0445 \u0442\u0435\u043c. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 REST \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c\u044e, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0441\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043e\u0448\u0438\u0431\u043e\u043a. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0438 JPA \u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 JpaRepository.<\/p>\n<p><a href=\"https:\/\/github.com\/Vintentas\/SpringBootApp\" rel=\"noopener noreferrer nofollow\">\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 \u043a\u043e\u0434\u043e\u043c<\/a><\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/565242\/\"> https:\/\/habr.com\/ru\/post\/565242\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0412\u0430\u0440\u0432\u0430\u0440\u0430 \u0438 \u044f Java Developer \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u201c\u0426\u0438\u0444\u0440\u043e\u0432\u044b\u0435 \u043f\u0440\u0438\u0432\u044b\u0447\u043a\u0438\u201d. \u042f \u043f\u0440\u043e\u0448\u043b\u0430 \u0438\u0445 \u043a\u0443\u0440\u0441 \u043f\u043e Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438 \u043f\u043e \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430 &nbsp;\u043e\u0444\u0444\u0435\u0440 \u043e\u0442 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438. \u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c \u0441 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0432\u043e\u0440\u043a\u0448\u043e\u043f\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043c \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b \u043e\u0434\u0438\u043d \u0438\u0437 \u043b\u0435\u043a\u0442\u043e\u0440\u043e\u0432 &#8212; \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u0420\u043e\u043c\u0430\u043d\u043e\u0432, Software Architect \u0438 \u043f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u0435\u043b\u044c \u0411\u0430\u0443\u043c\u0430\u043d\u043a\u0438.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043c\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u0435 REST \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0441\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c SpringBoot, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u0432\u043e\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b, \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f JPA, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c PostgreSQL.<\/p>\n<p>    \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 3 \u044d\u0442\u0430\u043f\u0430:<\/p>\n<ol>\n<li>\n<p> \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0435 REST \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 SpringBoot<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c\u0438, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c JPA<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0438 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0438 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0443\u0434\u0438\u0432\u0438\u043c\u0441\u044f, \u0447\u0442\u043e \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 \u043f\u043e\u0440\u0430\u0434\u0443\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u0432\u0440\u0435\u043c\u044f \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0439 \u0438 \u0443\u0437\u043d\u0430\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043d\u043e\u0432\u043e\u0435<\/p>\n<\/li>\n<\/ol>\n<h3>    1. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0435 REST \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 SpringBoot<\/h3>\n<p>\u041c\u044b \u043f\u043e\u0439\u0434\u0435\u043c \u043f\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u043c\u0443 \u043f\u0443\u0442\u0438, \u0430 \u0442\u043e\u0447\u043d\u0435\u0435 \u0437\u0430\u0439\u0434\u0435\u043c \u043d\u0430 \u0441\u0430\u0439\u0442-\u0441\u0442\u0430\u0440\u0442\u0435\u0440 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043d\u0430 SpringBoot: <a href=\"https:\/\/start.spring.io\/\" rel=\"noopener noreferrer nofollow\"><u>https:\/\/start.spring.io\/<\/u><\/a>. \u0412\u044b\u0431\u0435\u0440\u0435\u043c \u0441\u0431\u043e\u0440\u043a\u0443 gradle + Java. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0438 \u0441\u043e\u0431\u0435\u0440\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0438 \u0436\u0434\u0435\u043c \u043f\u043e\u043a\u0430 \u043f\u043e\u0433\u0434\u0440\u0443\u0437\u044f\u0442\u0441\u044f \u0432\u0441\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043a\u0438 \u0438 \u0441\u043e\u0431\u0435\u0440\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0435\u043a\u0442.<\/p>\n<p>    <strong><em>.\/gradlew wrapper <\/em><\/strong>&#8212; \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0443\u0436\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 wrapper.<\/p>\n<p>    <strong><em>.\/gradlew clean build bootRun<\/em><\/strong> &#8212; \u0441\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043f\u0440\u043e\u0433\u043e\u043d unit-\u0442\u0435\u0441\u0442\u043e\u0432, \u0437\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0443\u0442\u0438\u043b\u0438\u0442\u0443 <strong><em>gradlew <\/em><\/strong>(\u043f\u043e \u0441\u0443\u0442\u0438 \u044d\u0442\u043e \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 gradle), \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0438\u043c\u0435\u0442\u044c \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 Gradle \u043d\u0430 \u0441\u0432\u043e\u0435\u043c \u041f\u041a. \u042d\u0442\u0430 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0441\u0430\u043c\u0430 \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e, \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438. \u041f\u043e \u0441\u0443\u0442\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f gradlew, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0442\u044c\/\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u0441\u043e \u0432\u0441\u0435\u043c\u0438, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u0432\u0435\u0440\u0441\u0438\u044e \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c Gradle. Gradlew \u0447\u0438\u0442\u0430\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 <strong><em>gradle\/wrapper\/gradle-wrapper.properties<\/em><\/strong>.<\/p>\n<p>\u041c\u044b \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043d\u043e \u043f\u043e\u043a\u0430 \u043e\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f, \u043d\u043e \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u0417\u0430\u0445\u043e\u0434\u0438\u043c \u0432 \u0444\u0430\u0439\u043b <strong><em>build.gradle<\/em><\/strong>, \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u043c\u043e\u0437\u0433 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0417\u0434\u0435\u0441\u044c \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.&nbsp; \u0421\u0435\u0439\u0447\u0430\u0441 \u043e\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"java\">plugins {   id 'java'   id 'org.springframework.boot' version '2.5.1'   id 'io.spring.dependency-management' version '1.0.11.RELEASE' }  group = 'ru.dhabits.spring_boot_example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8'  repositories {   mavenCentral() }  dependencies {   implementation 'org.springframework.boot:spring-boot-starter'   testImplementation 'org.springframework.boot:spring-boot-starter-test' }  test {   useJUnitPlatform() }<\/code><\/pre>\n<p>\u0420\u0430\u0437\u0434\u0435\u043b <strong><em>plugins <\/em><\/strong>\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u043b\u0430\u0433\u0438\u043d\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438 \u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,<strong><em> id &#8216;java&#8217;<\/em><\/strong> &#8212; \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0430\u043c\u043e\u0439 java, \u0431\u0435\u0437 \u043d\u0435\u0435 \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u043e\u043e\u0431\u0449\u0435. \u0420\u0430\u0437\u0434\u0435\u043b <strong><em>repositories<\/em><\/strong> &#8212; \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0440\u0435\u0441\u0443\u0440\u0441 \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0443\u0442 \u0441\u043a\u0430\u0447\u0430\u043d\u044b \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u044d\u0442\u043e mavenCentral. <strong><em>dependencies <\/em><\/strong>&#8212; \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043d\u0430\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u0441\u0442\u0430\u0440\u0442\u0435\u0440\u044b SpringBoot. <strong><em>test <\/em><\/strong>&#8212; \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043f\u0440\u043e\u0433\u043e\u043d\u0430 \u0442\u0435\u0441\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d JUnit. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b <strong><em>group<\/em><\/strong>, <strong><em>version <\/em><\/strong>\u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0437\u0430 \u0433\u0440\u0443\u043f\u043f\u0443 \u0438 \u0432\u0435\u0440\u0441\u0438\u044e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0430<strong><em> sourceCompatibility<\/em><\/strong> &#8212; \u0432\u0435\u0440\u0441\u0438\u044e java.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432 dependencies \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 PEST API:<\/p>\n<pre><code class=\"java\">implementation \"org.springframework.boot:spring-boot-starter-web\"<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c&nbsp; \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 &#8212; \u043a\u043b\u0430\u0441\u0441 \u0441 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439 <em>@RestController<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043c\u0435\u0435\u0442 \u0447\u0442\u043e-\u0442\u043e \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u043c\u0443 \u043f\u043e\u043b\u0435 \u0438 \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044f.<\/p>\n<pre><code class=\"java\">@RestController public class controller {     @Value(\"${spring.application.name}\")    private String name;     @GetMapping    public String getNameApplication() {        return name;    } }<\/code><\/pre>\n<p><strong><em>@RestController<\/em><\/strong> = @Controller + @ResponseBody. \u0410\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f <strong><em>@Controller <\/em><\/strong>\u0443\u043c\u0435\u0435\u0442 \u0441\u043b\u0443\u0448\u0430\u0442\u044c, \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u044b. \u0410 <strong><em>@ResponseBody<\/em><\/strong>&nbsp; \u0434\u0430\u0435\u0442 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0443 \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u0430 \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0433\u043d\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 HttpMessageConverter, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u043e\u0435 \u043a \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435.<\/p>\n<p><strong><em>@Value(&#171;${spring.application.name}&#187;)<\/em><\/strong> &#8212; \u0443\u043c\u0435\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0437 application.properties \u0444\u0430\u0439\u043b\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <strong><em>${}<\/em><\/strong>. <strong><em>@GetMapping<\/em><\/strong> &#8212; \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 SpringBoot, \u0447\u0442\u043e \u044d\u0442\u043e get \u043c\u0435\u0442\u043e\u0434 \u0438 \u043e\u043d \u0443\u043c\u0435\u0435\u0442 \u0447\u0442\u043e-\u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c.<\/p>\n<p>\u0412 \u0444\u0430\u0439\u043b <em>application.properties<\/em> \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u0442\u0440\u043e\u043a\u0443:&nbsp;<\/p>\n<pre><code class=\"java\">spring.application.name=spring_boot_example<\/code><\/pre>\n<p>\u0412\u0443\u0430\u043b\u044f! \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f, \u043d\u043e \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 &#171;spring_boot_example&#187; \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443: <a href=\"http:\/\/localhost:8080\/\" rel=\"noopener noreferrer nofollow\"><u>http:\/\/localhost:8080\/<\/u><\/a>.<\/p>\n<h3>    2. \u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c\u0438, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c JPA<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043c JPA, \u043f\u0430\u0440\u0443 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0434\u043b\u044f \u043d\u0438\u0445 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b.<\/p>\n<h4>    2.1. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0438 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439<\/h4>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u0447\u0442\u043e\u0431 \u0432\u0441\u0435 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e &#8212; \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a \u0432 <em>build.gradle<\/em>. Data-jpa \u0438 postgresql &#8212; \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043d\u0430\u0431\u043e\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0411\u0414, \u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0441 Postgre. Lombok \u0438 lang3 \u0443\u043f\u0440\u043e\u0449\u0430\u044e\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 POJO (Plain Old Java Object \u2014 \u00ab\u0441\u0442\u0430\u0440\u044b\u0439 \u0434\u043e\u0431\u0440\u044b\u0439 Java-\u043e\u0431\u044a\u0435\u043a\u0442\u00bb), \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u043e\u0434.<\/p>\n<p>&nbsp;\u0410\u043d\u043d\u043e\u0442\u0438\u0440\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"java\">@Getter @Setter @Accessors(chain = true) @Entity @Table(name = \"address\")<\/code><\/pre>\n<p>&nbsp;    \u0410\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438: <strong><em>@Getter<\/em><\/strong> \u0438 <strong><em>@Setter<\/em><\/strong> \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442 get \u0438 set \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044f. <strong><em>@Accessors(chain = true)<\/em><\/strong> &#8212; \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0447\u0442\u043e \u0441\u0435\u0442\u0442\u0435\u0440 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0441\u0435\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044f. <strong><em>@Entity<\/em><\/strong> &#8212; \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 &#8212; \u044d\u0442\u043e POJO \u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 JPA \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0443 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u0438\u0437 <strong><em>@Table<\/em><\/strong>. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043c\u044f \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 <strong><em>@Column<\/em><\/strong>. \u0414\u043b\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b <em>User <\/em>\u043f\u043e\u043b\u0435 <em>login <\/em>&#8212; \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e \u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c null, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b <strong><em>nullable = false<\/em><\/strong>,<strong><em> unique = true<\/em><\/strong>.<\/p>\n<p>&nbsp;    \u041f\u043e\u043b\u0435 <em>Address <\/em>\u0432 \u043a\u043b\u0430\u0441\u0441\u0435 <em>User <\/em>\u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"java\">@OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = \"address_id\", foreignKey = @ForeignKey(name = \"fk_users_address_id\")) private Address address;<\/code><\/pre>\n<p>\u0410\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f <strong><em>@OneToOne<\/em><\/strong> &#8212; \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0441\u0432\u044f\u0437\u044c \u0442\u0430\u0431\u043b\u0438\u0446 \u043e\u0434\u0438\u043d \u043a \u043e\u0434\u043d\u043e\u043c\u0443, \u0430 <strong><em>fetch = FetchType.LAZY<\/em><\/strong> \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u044d\u0442\u043e \u043b\u0435\u043d\u0438\u0432\u0430\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f. \u0422\u043e \u0435\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b address \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u043a\u043b\u044e\u0447\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430 \u043a \u043d\u0438\u043c \u043e\u0431\u0440\u0430\u0442\u044f\u0442\u0441\u044f. <strong><em>@JoinColumn<\/em><\/strong> &#8212; \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0442\u0430\u0431\u043b\u0438\u0446\u0435 address. <strong><em>name = &#171;address_id&#187;<\/em><\/strong> &#8212; \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430, \u0430 <strong><em>foreignKey = @ForeignKey(name = &#171;fk_users_address_id&#187;)<\/em><\/strong> &#8212; \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e. \u041f\u0438\u0441\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u0430 \u0434\u043b\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c <strong><em>(fk_users_address_id)<\/em><\/strong> \u0443\u0434\u043e\u0431\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u043a\u0430\u043a\u0438\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u0438 \u043a\u0430\u043a.<\/p>\n<p>&nbsp;    \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b <em>hashCode<\/em>, <em>equals <\/em>\u0438 <em>toString<\/em>. \u0414\u043b\u044f <em>User <\/em>\u043c\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c hashCode \u0438 equals \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u043f\u043e\u043b\u044e <em>login<\/em>, \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u044d\u0442\u043e \u043f\u043e\u043b\u0435 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0438 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u043c \u043e\u0442 null. \u0422\u0430\u043a \u0436\u0435 \u0434\u043b\u044f <em>User <\/em>\u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 toString \u043c\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u043e\u043b\u0435 <em>address<\/em>. \u0420\u0430\u043d\u0435\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043b\u0435\u043d\u0438\u0432\u0430\u044f, \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u043d\u0435 \u043f\u043e\u0434\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443, \u0430 \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a hibernate \u0438 \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0431\u0435\u0437 @Transactional, \u0442\u043e \u0443\u043f\u0430\u0434\u0435\u043c \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439.<\/p>\n<p>&nbsp;&nbsp;    \u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439:<\/p>\n<p>&nbsp;    \u0421\u0443\u0449\u043d\u043e\u0441\u0442\u044c User:<\/p>\n<pre><code class=\"java\">@Getter @Setter @Accessors(chain = true) @Entity @Table(name = \"users\") public class User {     @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Integer id;     @Column(name = \"login\",nullable = false, unique = true)    private String login;     @Column(name = \"firstName\")    private String firstName;     @Column(name = \"middleName\")    private String middleName;     @Column(name = \"lastName\")    private String lastName;     @Column(name = \"age\")    private Integer age;     @OneToOne(fetch = FetchType.LAZY)    @JoinColumn(name = \"address_id\", foreignKey = @ForeignKey(name = \"fk_users_address_id\"))    private Address address;     @Override    public boolean equals(Object o) {        if (this == o) return true;        if (o == null || getClass() != o.getClass()) return false;        User user = (User) o;        return login.equals(user.login);    }     @Override    public int hashCode() {        return Objects.hash(login);    }     @Override    public String toString() {        return \"User{\" +                \"id=\" + id +                \", login='\" + login + '\\'' +                \", firstName='\" + firstName + '\\'' +                \", middleName='\" + middleName + '\\'' +                \", lastName='\" + lastName + '\\'' +                \", age=\" + age +                '}';    } }<\/code><\/pre>\n<p>\u0421\u0443\u0449\u043d\u043e\u0441\u0442\u044c Address:<\/p>\n<pre><code class=\"java\">\t @Getter @Setter @Accessors(chain = true) @Entity @Table(name = \"address\") public class Address {     @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Integer id;     @Column(name = \"street\")    private String street;     @Column(name = \"city\")    private String city;     @Column(name = \"building\")    private String building;     @Override    public boolean equals(Object o) {        if (this == o) return true;        if (o == null || getClass() != o.getClass()) return false;        Address address = (Address) o;        return street.equals(address.street) &amp;&amp; city.equals(address.city) &amp;&amp; building.equals(address.building);    }     @Override    public int hashCode() {        return Objects.hash(street, city, building);    }     @Override    public String toString() {        return \"Address{\" +                \"id=\" + id +                \", street='\" + street + '\\'' +                \", city='\" + city + '\\'' +                \", building='\" + building + '\\'' +                '}';    } }<\/code><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u2013 \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043c\u0435\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u0430, \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u0432\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438 \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u0435\u0433\u043e \u043e\u0442 <em>JpaRepository<\/em>. \u0412\u0441\u0435. SpringBoot \u0441\u0430\u043c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043b\u0430\u0441\u0441, \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u044d\u0442\u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442 \u0442\u0430\u043c, \u0433\u0434\u0435 \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e.<\/p>\n<pre><code class=\"java\">public interface UserRepository extends JpaRepository&lt;User, Integer&gt; {}<\/code><\/pre>\n<p><strong><em>JpaRepository<\/em><\/strong> \u2013 \u044d\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 Spring Data \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u043d\u0430\u0431\u043e\u0440 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 JPA \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0411\u0414.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 MVC \u043c\u043e\u0434\u0435\u043b\u044c\u044e \u043b\u043e\u0433\u0438\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 2 \u0447\u0430\u0441\u0442\u0438. \u041a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043c\u0435\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0410<\/p>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-325684","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/325684","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=325684"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/325684\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=325684"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=325684"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=325684"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}