소소한개발팁
article thumbnail
Published 2023. 9. 1. 23:56
JPA - 연관관계 컴퓨터 언어/Java
반응형

1. 연관관계의 종류

JPA에서는 일대일, 일대다, 다대일, 다대다 등 다양한 종류의 연관관계를 지원합니다.  @OneToOne, @OneToMany, @ManyToOne, @ManyToMany 등의 어노테이션을 사용하여 연관관계를 매핑합니다. 

 

2. 단방향 연관관계 매핑

예제로 Book과 Author라는 두 개의 엔티티가 있고, 각 책은 하나의 저자에게 속한다고 가정합니다. 이것을 단방향 연관관계로 매핑한 방법입니다.

 

2.1. 예제 코드

Entity

<java />
@Entity public class Book { @Id @GeneratedValue private Long id; private String title; @ManyToOne private Author author; // getter, setter, 생성자 등 } @Entity public class Author { @Id @GeneratedValue private Long id; private String name; // getter, setter, 생성자 등 }

 

  • Book 엔티티는 Author 엔티티와 다대일(@ManyToOne) 단방향 연관관계를 가집니다.
  • Author 엔티티는 Book 엔티티와 어떤 관계도 가지지 않습니다.

 

3. 양방향 연관관계 매핑

3.1. 예제 코드

Entity

<java />
@Entity public class Book { @Id @GeneratedValue private Long id; private String title; @ManyToOne private Author author; // getter, setter, 생성자 등 } @Entity public class Author { @Id @GeneratedValue private Long id; private String name; @OneToMany(mappedBy = "author") // mappedBy 속성을 사용하여 양방향 연관관계를 매핑 private List<Book> books = new ArrayList<>(); // getter, setter, 생성자 등 }

 

  • Author 엔티티는 Book 엔티티와 일대다(@OneToMany) 양방향 연관관계를 가집니다. mappedBy 속성을 사용하여 양방향 관계의 주인을 지정합니다.

 

4. 양방향 연관관계 데이터 갱신

양방향 연관관계에서 데이터를 업데이트하려면 관계의 양쪽에서 각각 엔티티를 수정하고, 엔티티 매니저를 사용하여 트랜잭션 내에서 변경을 커밋해야 합니다. 

 

4.1. 예제 코드

Entity

<java />
@Entity public class Book { @Id @GeneratedValue private Long id; private String title; @ManyToOne private Author author; // Getter와 Setter 메서드 // 생성자 등 } @Entity public class Author { @Id @GeneratedValue private Long id; private String name; @OneToMany(mappedBy = "author", cascade = CascadeType.ALL, orphanRemoval = true) private List<Book> books = new ArrayList<>(); // Getter와 Setter 메서드 // 생성자 등 // 작가의 책 목록을 업데이트하는 메서드 public void addBook(Book book) { books.add(book); book.setAuthor(this); } public void removeBook(Book book) { books.remove(book); book.setAuthor(null); } }

 

Data Update Code

<java />
EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-persistence-unit"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); try { // 작가 엔티티 조회 또는 생성 Author author = em.find(Author.class, authorId); if (author == null) { author = new Author(); author.setName("Author Name"); } // 책 엔티티 생성 또는 조회 Book book = em.find(Book.class, bookId); if (book == null) { book = new Book(); book.setTitle("Book Title"); } // 작가의 책 목록 업데이트 author.addBook(book); // 트랜잭션 커밋 tx.commit(); } catch (Exception e) { // 트랜잭션 롤백 또는 예외 처리 tx.rollback(); } finally { em.close(); emf.close(); }

 

반응형

 

5. 주의해야 할 점과 무한 루프 문제 해결 방법

무한 루프 문제를 예방하기 위해 한쪽 방향의 연관관계를 toString(), hashCode(), equals() 메서드에서 제외하는 것이 좋습니다.

 

5.1. 해결 방안 예제 코드

<java />
@Override public String toString() { return "Author{" + "id=" + id + ", name='" + name + '\'' + '}'; }

 

  • Author 엔티티의 toString() 메서드에서 books 필드를 출력하지 않도록 수정
반응형

'컴퓨터 언어 > Java' 카테고리의 다른 글

JPA - Proxy(프록시) 이해하기  (0) 2023.09.07
JPA - 상속 관계 및 MappedSuperclass  (0) 2023.09.07
JPA - 영속성  (0) 2023.09.01
JPA - 주요 엔티티 12가지  (0) 2023.08.29
JPA - 엔티티 매핑  (0) 2023.08.29
profile

소소한개발팁

@개발자 뱅

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!