diff --git a/spring-data-jpa-2/initial/src/main/java/cholog/Author.java b/spring-data-jpa-2/initial/src/main/java/cholog/Author.java index 937debe1..d7f26ba7 100644 --- a/spring-data-jpa-2/initial/src/main/java/cholog/Author.java +++ b/spring-data-jpa-2/initial/src/main/java/cholog/Author.java @@ -1,17 +1,23 @@ package cholog; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; +import jakarta.persistence.*; + +import java.util.HashSet; +import java.util.Set; @Entity public class Author { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @OneToOne + Person person; + + @OneToMany(mappedBy = "author") + Set books = new HashSet<>(); public Author(Person person) { + this.person = person; } public Author() { @@ -22,6 +28,10 @@ public Long getId() { } public Person getPerson() { - return null; + return person; + } + + public Set getBooks() { + return books; } } diff --git a/spring-data-jpa-2/initial/src/main/java/cholog/Book.java b/spring-data-jpa-2/initial/src/main/java/cholog/Book.java index 6f119218..ba1d00cb 100644 --- a/spring-data-jpa-2/initial/src/main/java/cholog/Book.java +++ b/spring-data-jpa-2/initial/src/main/java/cholog/Book.java @@ -1,10 +1,8 @@ package cholog; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; +import jakarta.persistence.*; +import java.util.HashSet; import java.util.Set; @Entity @@ -13,12 +11,19 @@ public class Book { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; + @ManyToOne + Publisher publisher; + + @OneToMany(mappedBy = "book") + Set authors = new HashSet<>(); public Book() { } public Book(String name, Publisher publisher) { + this.name = name; + this.publisher = publisher; } public Long getId() { @@ -30,10 +35,10 @@ public String getName() { } public Publisher getPublisher() { - return null; + return publisher; } - public Set getAuthors() { - return null; + public Set getAuthors() { + return authors; } } diff --git a/spring-data-jpa-2/initial/src/main/java/cholog/BookAuthor.java b/spring-data-jpa-2/initial/src/main/java/cholog/BookAuthor.java index 4d9c8d73..e2d1df45 100644 --- a/spring-data-jpa-2/initial/src/main/java/cholog/BookAuthor.java +++ b/spring-data-jpa-2/initial/src/main/java/cholog/BookAuthor.java @@ -1,7 +1,26 @@ package cholog; +import jakarta.persistence.*; + +@Entity public class BookAuthor { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + Book book; + + @ManyToOne + Author author; + public BookAuthor(Book book, Author author) { + this.book = book; + this.author = author; + } + + public BookAuthor() { } } diff --git a/spring-data-jpa-2/initial/src/main/java/cholog/Person.java b/spring-data-jpa-2/initial/src/main/java/cholog/Person.java index 6cf1d009..3dd4ef38 100644 --- a/spring-data-jpa-2/initial/src/main/java/cholog/Person.java +++ b/spring-data-jpa-2/initial/src/main/java/cholog/Person.java @@ -1,9 +1,6 @@ package cholog; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; +import jakarta.persistence.*; @Entity public class Person { @@ -11,7 +8,8 @@ public class Person { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; - + @OneToOne(mappedBy = "person", fetch = FetchType.LAZY) + Author author; public Person() { } @@ -29,6 +27,6 @@ public String getName() { } public Author getAuthor() { - return null; + return author; } } diff --git a/spring-data-jpa-2/initial/src/main/java/cholog/Publisher.java b/spring-data-jpa-2/initial/src/main/java/cholog/Publisher.java index b0c6303e..60e1b6bb 100644 --- a/spring-data-jpa-2/initial/src/main/java/cholog/Publisher.java +++ b/spring-data-jpa-2/initial/src/main/java/cholog/Publisher.java @@ -1,10 +1,8 @@ package cholog; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; +import jakarta.persistence.*; +import java.util.HashSet; import java.util.Set; @Entity @@ -13,6 +11,8 @@ public class Publisher { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; + @OneToMany(mappedBy = "publisher", fetch = FetchType.EAGER) + Set books = new HashSet<>(); public Publisher(String name) { this.name = name; @@ -30,10 +30,10 @@ public String getName() { } public void addBook(Book book) { - + books.add(book); } public Set getBooks() { - return null; + return books; } } diff --git a/spring-data-jpa-2/initial/src/test/java/cholog/ManyToOneTest.java b/spring-data-jpa-2/initial/src/test/java/cholog/ManyToOneTest.java index 71ef6b8f..bf5a20c6 100644 --- a/spring-data-jpa-2/initial/src/test/java/cholog/ManyToOneTest.java +++ b/spring-data-jpa-2/initial/src/test/java/cholog/ManyToOneTest.java @@ -45,8 +45,8 @@ void biDirection() { entityManager.persist(book); publisher.addBook(book); - entityManager.flush(); - entityManager.clear(); + entityManager.flush(); // 영속성 컨텍스트에 있는 publisher와 book 엔티티의 상태(추가 및 연관관계 설정)가 데이터베이스에 반영됩니다. 즉, Publisher와 Book 객체가 실제 데이터베이스에 저장 + entityManager.clear(); // 영속성 컨텍스트를 초기화하여 현재 관리되고 있는 모든 엔티티를 비영속 상태로 만듭니다. 이후 Publisher 객체를 조회할 때, 영속성 컨텍스트가 아닌 데이터베이스에서 해당 엔티티를 다시 가져오게 됩니다 Publisher persistPublisher = entityManager.find(Publisher.class, publisher.getId()); assertThat(persistPublisher).isNotNull();