DB에서는 외래키 참조를 하면 외래키 하나로 두 테이블을 조인할 수 있다. 따라서 방향을 나눌 필요가 없으나, 객체는 참조용 필드가 있어야만 다른 객체를 참조할 수 있다.
불필요한 양방향 설계 시, 객체마다 연관관계가 생겨 객체의 복잡성이 매우 증가한다. 기본적으로 단방향 설계를 하고, 역방향으로 객체 탐색이 필요한 경우(게시물에서 게시판 탐색)에만 양방향으로 추가를 해주는 것이 좋다.
mappedBy
속성을 사용해 주인을 지정한다.게시판-게시물 관계에서 게시판이 게시물을 소유하고 있어 게시판을 주인으로 생각할 수 있지만, 게시판에서 게시물 정보를 바꾸고 싶으면 게시물의 FK를 바꿔 주어야 한다. 따라서 수정이 이루어지는 게시물 객체가 주인이 된다.
@JoinColumn
어노테이션의 name 속성에 설정할 FK이름을 설정해 주면 된다.@JoinColumn(name="fk_name")
이제 실제 예시를 보면서 공부한다. 단방향의 경우 연관관계의 주인이 아닌 Entity에 설정을 안해주면 되므로, 양방향만 보기로 한다.
@Entity
@Table(name="book_store")
@Getter @Setter
public class BookStore {
@Id
@Column
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@Column(nullable=false, length=100)
private String name;
@OneToMany(mappedBy="book_store")
private Set<Book> books = new HashSet<Book>();
}
@Entity
@Table( name="book")
@Getter @Setter
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable=false, length=200)
private String title;
@ManyToOne
@JoinColumn(name ="book_store_id")
private BookStore bookStore;
}