diff --git a/2021-03/spring-13-data-jpa/.gitignore b/2021-03/spring-13-data-jpa/.gitignore
new file mode 100644
index 00000000..e62c33c2
--- /dev/null
+++ b/2021-03/spring-13-data-jpa/.gitignore
@@ -0,0 +1,4 @@
+.idea/
+*.iml
+
+target/
diff --git a/2021-03/spring-13-data-jpa/pom.xml b/2021-03/spring-13-data-jpa/pom.xml
new file mode 100644
index 00000000..da37d94f
--- /dev/null
+++ b/2021-03/spring-13-data-jpa/pom.xml
@@ -0,0 +1,17 @@
+
+
+ 4.0.0
+
+ ru.otus
+ spring-13-data-jpa
+ 1.0
+
+ pom
+
+
+ spring-13-exercise
+ spring-13-solution
+
+
diff --git a/2021-03/spring-13-data-jpa/spring-13-exercise/.gitignore b/2021-03/spring-13-data-jpa/spring-13-exercise/.gitignore
new file mode 100644
index 00000000..e62c33c2
--- /dev/null
+++ b/2021-03/spring-13-data-jpa/spring-13-exercise/.gitignore
@@ -0,0 +1,4 @@
+.idea/
+*.iml
+
+target/
diff --git a/2021-03/spring-13-data-jpa/spring-13-exercise/pom.xml b/2021-03/spring-13-data-jpa/spring-13-exercise/pom.xml
new file mode 100644
index 00000000..5f36b7ef
--- /dev/null
+++ b/2021-03/spring-13-data-jpa/spring-13-exercise/pom.xml
@@ -0,0 +1,50 @@
+
+
+ 4.0.0
+
+ ru.otus
+ spring-13-exercise
+ 1.0-SNAPSHOT
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.4.5
+
+
+
+ 11
+ 11
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ com.h2database
+ h2
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
diff --git a/2021-03/spring-13-data-jpa/spring-13-exercise/src/main/java/ru/otus/springdata/Main.java b/2021-03/spring-13-data-jpa/spring-13-exercise/src/main/java/ru/otus/springdata/Main.java
new file mode 100644
index 00000000..59a032bd
--- /dev/null
+++ b/2021-03/spring-13-data-jpa/spring-13-exercise/src/main/java/ru/otus/springdata/Main.java
@@ -0,0 +1,22 @@
+package ru.otus.springdata;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.ConfigurableApplicationContext;
+//import ru.otus.spring10.repostory.PersonRepository;
+
+
+@SpringBootApplication
+public class Main {
+
+ public static void main(String[] args) {
+ ConfigurableApplicationContext context = SpringApplication.run(Main.class);
+ //PersonRepository personRepository = context.getBean(PersonRepository.class);
+ //EmailRepository emailRepository = context.getBean(EmailRepository.class);
+
+ // personRepository.save(new Person("Pushkin"));
+ // personRepository.save(new Person("Lermontov"));
+ }
+
+
+}
diff --git a/2021-03/spring-13-data-jpa/spring-13-exercise/src/main/java/ru/otus/springdata/domain/Email.java b/2021-03/spring-13-data-jpa/spring-13-exercise/src/main/java/ru/otus/springdata/domain/Email.java
new file mode 100644
index 00000000..5cb61fa0
--- /dev/null
+++ b/2021-03/spring-13-data-jpa/spring-13-exercise/src/main/java/ru/otus/springdata/domain/Email.java
@@ -0,0 +1,21 @@
+package ru.otus.springdata.domain;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class Email {
+
+ private long id;
+
+ private String address;
+
+ public Email(String address) {
+ this.address = address;
+ }
+
+}
diff --git a/2021-03/spring-13-data-jpa/spring-13-exercise/src/main/java/ru/otus/springdata/domain/Person.java b/2021-03/spring-13-data-jpa/spring-13-exercise/src/main/java/ru/otus/springdata/domain/Person.java
new file mode 100644
index 00000000..cc8e6d0a
--- /dev/null
+++ b/2021-03/spring-13-data-jpa/spring-13-exercise/src/main/java/ru/otus/springdata/domain/Person.java
@@ -0,0 +1,26 @@
+package ru.otus.springdata.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Entity
+public class Person {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private long id;
+
+ private String name;
+
+ public Person(String name) {
+ this.name = name;
+ }
+}
diff --git a/2021-03/spring-13-data-jpa/spring-13-exercise/src/main/java/ru/otus/springdata/repository/EmailRepository.java b/2021-03/spring-13-data-jpa/spring-13-exercise/src/main/java/ru/otus/springdata/repository/EmailRepository.java
new file mode 100644
index 00000000..f0f5424f
--- /dev/null
+++ b/2021-03/spring-13-data-jpa/spring-13-exercise/src/main/java/ru/otus/springdata/repository/EmailRepository.java
@@ -0,0 +1,4 @@
+package ru.otus.springdata.repository;
+
+public interface EmailRepository {
+}
diff --git a/2021-03/spring-13-data-jpa/spring-13-exercise/src/main/java/ru/otus/springdata/repository/PersonRepository.java b/2021-03/spring-13-data-jpa/spring-13-exercise/src/main/java/ru/otus/springdata/repository/PersonRepository.java
new file mode 100644
index 00000000..a084d42a
--- /dev/null
+++ b/2021-03/spring-13-data-jpa/spring-13-exercise/src/main/java/ru/otus/springdata/repository/PersonRepository.java
@@ -0,0 +1,4 @@
+package ru.otus.springdata.repository;
+
+public interface PersonRepository {
+}
diff --git a/2021-03/spring-13-data-jpa/spring-13-solution/.gitignore b/2021-03/spring-13-data-jpa/spring-13-solution/.gitignore
new file mode 100644
index 00000000..e62c33c2
--- /dev/null
+++ b/2021-03/spring-13-data-jpa/spring-13-solution/.gitignore
@@ -0,0 +1,4 @@
+.idea/
+*.iml
+
+target/
diff --git a/2021-03/spring-13-data-jpa/spring-13-solution/pom.xml b/2021-03/spring-13-data-jpa/spring-13-solution/pom.xml
new file mode 100644
index 00000000..5bc2c71d
--- /dev/null
+++ b/2021-03/spring-13-data-jpa/spring-13-solution/pom.xml
@@ -0,0 +1,55 @@
+
+
+ 4.0.0
+
+ ru.otus
+ spring-13-solution
+ 1.0-SNAPSHOT
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.4.5
+
+
+
+ 11
+ 11
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ com.h2database
+ h2
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
diff --git a/2021-03/spring-13-data-jpa/spring-13-solution/src/main/java/ru/otus/springdata/Main.java b/2021-03/spring-13-data-jpa/spring-13-solution/src/main/java/ru/otus/springdata/Main.java
new file mode 100644
index 00000000..1e634ab6
--- /dev/null
+++ b/2021-03/spring-13-data-jpa/spring-13-solution/src/main/java/ru/otus/springdata/Main.java
@@ -0,0 +1,48 @@
+package ru.otus.springdata;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.ConfigurableApplicationContext;
+import ru.otus.springdata.domain.Email;
+import ru.otus.springdata.domain.Person;
+import ru.otus.springdata.repository.EmailRepository;
+import ru.otus.springdata.repository.PersonRepository;
+
+@SpringBootApplication
+public class Main {
+
+ public static void main(String[] args) {
+ ConfigurableApplicationContext context = SpringApplication.run(Main.class);
+ PersonRepository personRepository = context.getBean(PersonRepository.class);
+ EmailRepository emailRepository = context.getBean(EmailRepository.class);
+
+ Email emailP = new Email("alex@pushkin.ru");
+ emailP = emailRepository.save(emailP);
+
+ Email emailL = new Email("michail@lermontov.ru");
+ emailL = emailRepository.save(emailL);
+
+ personRepository.save(new Person("Pushkin", emailP));
+ personRepository.save(new Person("Lermontov",emailL));
+
+ System.out.println("\n\nИщем Пушкина");
+ personRepository.findByName("Pushkin").ifPresent(System.out::println);
+
+ System.out.println("\n\nИщем всех пёрсонов");
+ System.out.println(emailRepository.findAll());
+
+ System.out.println("\n\nИщем Пушкина по его почте");
+ personRepository.findByEmailAddress("alex@pushkin.ru").ifPresent(System.out::println);
+
+ System.out.println("\n\nИщем почту Пушкина");
+ emailRepository.findByEmailAddress("alex@pushkin.ru").ifPresent(System.out::println);
+
+ System.out.println("\n\nОбновляем почту Лермонтову");
+ System.out.println("До обновления: " + emailL);
+ emailRepository.updateEmailById(emailL.getId(), "michail1984@lermontov.ru");
+ emailRepository.findById(emailL.getId()).ifPresent(e -> System.out.println("После обновления: " + e));
+
+ System.out.println("\n\n");
+
+ }
+}
diff --git a/2021-03/spring-13-data-jpa/spring-13-solution/src/main/java/ru/otus/springdata/domain/Email.java b/2021-03/spring-13-data-jpa/spring-13-solution/src/main/java/ru/otus/springdata/domain/Email.java
new file mode 100644
index 00000000..e3b8d344
--- /dev/null
+++ b/2021-03/spring-13-data-jpa/spring-13-solution/src/main/java/ru/otus/springdata/domain/Email.java
@@ -0,0 +1,27 @@
+package ru.otus.springdata.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Entity
+public class Email {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private long id;
+
+ private String address;
+
+ public Email(String address) {
+ this.address = address;
+ }
+}
diff --git a/2021-03/spring-13-data-jpa/spring-13-solution/src/main/java/ru/otus/springdata/domain/Person.java b/2021-03/spring-13-data-jpa/spring-13-solution/src/main/java/ru/otus/springdata/domain/Person.java
new file mode 100644
index 00000000..e24e42aa
--- /dev/null
+++ b/2021-03/spring-13-data-jpa/spring-13-solution/src/main/java/ru/otus/springdata/domain/Person.java
@@ -0,0 +1,30 @@
+package ru.otus.springdata.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Entity
+public class Person {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private long id;
+
+ private String name;
+
+ @OneToOne(orphanRemoval = true)
+ @JoinColumn(name = "email_id")
+ private Email email;
+
+ public Person(String name, Email email) {
+ this.name = name;
+ this.email = email;
+ }
+
+}
diff --git a/2021-03/spring-13-data-jpa/spring-13-solution/src/main/java/ru/otus/springdata/repository/EmailRepository.java b/2021-03/spring-13-data-jpa/spring-13-solution/src/main/java/ru/otus/springdata/repository/EmailRepository.java
new file mode 100644
index 00000000..66b4da80
--- /dev/null
+++ b/2021-03/spring-13-data-jpa/spring-13-solution/src/main/java/ru/otus/springdata/repository/EmailRepository.java
@@ -0,0 +1,21 @@
+package ru.otus.springdata.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.transaction.annotation.Transactional;
+import ru.otus.springdata.domain.Email;
+
+import java.util.Optional;
+
+public interface EmailRepository extends JpaRepository {
+
+ @Query("select e from Email e where e.address = :address")
+ Optional findByEmailAddress(@Param("address") String email);
+
+ @Modifying
+ @Transactional
+ @Query("update Email e set e.address = :address where e.id = :id")
+ void updateEmailById(@Param("id") long id, @Param("address") String address);
+}
diff --git a/2021-03/spring-13-data-jpa/spring-13-solution/src/main/java/ru/otus/springdata/repository/PersonRepository.java b/2021-03/spring-13-data-jpa/spring-13-solution/src/main/java/ru/otus/springdata/repository/PersonRepository.java
new file mode 100644
index 00000000..8f41f889
--- /dev/null
+++ b/2021-03/spring-13-data-jpa/spring-13-solution/src/main/java/ru/otus/springdata/repository/PersonRepository.java
@@ -0,0 +1,16 @@
+package ru.otus.springdata.repository;
+
+import org.springframework.data.repository.CrudRepository;
+import ru.otus.springdata.domain.Person;
+
+import java.util.List;
+import java.util.Optional;
+
+public interface PersonRepository extends CrudRepository {
+
+ List findAll();
+
+ Optional findByName(String s);
+
+ Optional findByEmailAddress(String email);
+}