@ManyToOne, @OneToMany.

june·2020년 12월 26일
0
public class User {
    @Id
    @Column(length = 30,nullable = false)
    private String userid;

    @Column(length = 30, nullable = false)
    private String pwd;

    @Column(length = 30,nullable = false)
    private String name;

    @Column(length = 30, nullable = false)
    private String email;

    @Column(length = 30, nullable = false)
    private String phone;

    @OneToMany(mappedBy = "user",targetEntity = Board.class)
    private List<Board> boards = new ArrayList<Board>();

    @OneToMany(mappedBy = "user",targetEntity = Comment.class)
    private List<Comment> comments = new ArrayList<Comment>();
}

public class Board {
    @Id
    @GeneratedValue
   	...

    @ManyToOne
    @JoinColumn(name="userid", nullable = false)
    private User user;


일대다 양방향, 다대일 양방향
연관관계의 주인은 항상 다 쪽인 @ManyToOne 을 사용한 곳이다.

일대다 단방향 매핑 반대편에 다대일 단방향 매핑을 추가했다. 이때 일대다 단방향 매핑과 같은 userid 외래키 컬럼을 매핑했다.

@ManyToOne 단방향 
public class Board{
...
@ManyToOne
    @JoinColumn(name="userid", nullable = false)
    private User user;
}

public class User {
    @Id
    @Column(length = 30,nullable = false)
    private String userid;

}

Board에 ManyToOne 걸어주고 JoinClumn에 User 테이블과 관계를 설정해 준다.
 User 테이블에 있는 userid 가 board에 userid로 정의된다.
 
 @OneToMany 단방향
 
 public class Board {
 @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(nullable = false)
    private Long board_seq;
    
 @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name="seq")
    List<Comment> comments = new ArrayList<Comment>();
}

public class Comment {
	@Column(name="seq",nullable = false)
    private Long seq;
}

Comment 테이블의 seq컬럼은 Board에 board_seq로 정의된다.

무조건 양방향으로만 해야 하는줄 알았는데 양방향으로 했을경우 N+1 문제가 생겨서 
단방향으로 하는방법을 찾아보고 적용하니까 잘 돌아가더라..
양방향이 필요한 컬럼은 양방향 해야겠지만 필요 없을땐 단방향으로..

정리.
CascadeType.PERSIST
엔티티를 영속화 할 때이 필드에 보유 된 엔티티도 유지합니다. EntityManager가 flush 중에 새로운 엔티티를 참조하는 필드를 찾고 이 필드가 CascadeType.PERSIST를 사용하지 않으면 오류이므로이 Cascade 규칙의 자유로운 적용을 제안합니다.

CascadeType.MERGE
엔티티 상태를 병합 할 때, 이 필드에 보유 된 엔티티도 병합.

CascadeType.REFRESH
엔티티를 새로 고칠 때, 이 필드에 보유 된 엔티티도 새로 고침.

CascadeType.REMOVE
엔티티를 삭제할 때, 이 필드에 보유 된 엔티티도 삭제.

CascadeType.DETACH
부모 엔티티가 detach()를 수행하게 되면, 연관된 엔티티도 detach() 상태가 되어 변경사항이 반영되지 않는다.

CascadeType.ALL
모든 Cascade 적용


orphanRemoval 
연결이 끊어진 엔티티를 같이 삭제하라는 의미로 Owner 객체와 참조가 끊어진 객체들을 정리할 때 유용하다.

@JoinColumn 외래 키를 매핑 할 때 사용.

0개의 댓글

관련 채용 정보