jun94
30
2020-05-22 23:29:16
7
144

JPA 외래키관련 질문 있습니다.


안녕하세요. 선배님들 다름이 아니라 JPA 외래키 테이블에 관련된 질문 하나 있습니다.


일단 상황은 JSP로 간단한 웹사이트 제작 중 인데요. 데이터베이스 쪽 처리를 하다가 외래키를 사용할 상황이 생겼습니다. 복잡한 상황은 아니고.. 1대 N 양방향 관계로 간단하게 구성할 계획입니다.

(parent가 1, child가 n인 상황)

여기서 제가 궁금한건 child가 생성될 때마다 parent의 children에 추가를 따로 해줘야 하는지가 궁금합니다.


@Entity(name="parent")
public Class Parent{
  @Id
  int id;
  String name;

  @OneToMany(mappedBy="parent", cascade = CascadeType.ALL, orphanRemoval = true)
  private List<Child> children = new ArrayList<>();

  public Parent(){ super();}
  public Parent(String name){
    super();
    this.name = name;
  }
  //getter setter...
}
@Entity(name="child")
public Class Child{
  @Id
  int id
  String name;
  
  @ManyToOne
  @JoinColumn(name="parent_id")
  private Parent parent;
  
  public Child(){ super();}
  public Child(String name, Parent parent){
    super();
    this.name = name;
    this.parent = parent;
  }
}


구조는 이렇고 EntityManager를 사용한다고 할 때, 아래코드 만으로도 child와 parent가 join(바인딩?) 되는건가요??


//begin.
Parent parent = new Parent("test");

EntityManager.persist(parent);
//commit

....

//begin
Child child = new Child("test", parent);

EntityManager.persist(child);
//commit


아니면 child가 생성될 때마다 parent의 children에다가 child를 수동으로 추가해줘야 하는건가요??


저는 child를 생성할 때 parent를 매개변수로 지정해주기 때문에 자동으로 바인딩(join?)된다고 생각하는데 아닌가요??

(mysql에서 테이블 생성시에 외래키 지정해놓으면 데이터 입력시 자동으로 join 되는 것처럼..)


JPA를 따로 공부를 하고 사용하는게 아니라.. 잘모르겠네요.. 


0
0
  • 답변 7

  • 시닙이
    850
    2020-05-22 23:37:30 작성 2020-05-22 23:46:27 수정됨

    @OneToMany 와 @ManyToOne으로 제약조건이 설정되있습니다.


    저장 하실떄 Cascade에 대해 알아보시면 그냥 컬렉션 add로도 추가할수 있습니다. 

    또는 고아객체에 대해 확인해보세욜~

    0
  • 초무쿤
    4k
    2020-05-22 23:47:43 작성 2020-05-22 23:51:12 수정됨

    음..저는 그냥 @OneToMnay만 설정해도 잘되더군요.

    0
  • jun94
    30
    2020-05-23 19:31:02 작성 2020-05-23 19:33:03 수정됨

    초무쿤

    OneToMany만 설정하면 단방향이 되지 않나용?? 단방향은 자원 관련 문제가 좀 있고 데이터가 복잡한 구조가 될 때 추가해줘야 하는 작업이 있다고 하더라구용.. 


    시닙이

    답변 감사합니다..좀 더 공부해봐야 겠네요!



    0
  • 초무쿤
    4k
    2020-05-23 19:43:10 작성 2020-05-23 19:43:43 수정됨

    @jun94 

    네.단방향 맞습니다. 메뉴얼대로 양방향으로 Entity간에 연관관계를 다 정의해니 너무 복잡해지네요.

    무조건 FM대로 양방향으로 해줘야하나 그런 의구심도 좀 있고 그래서 그냥 적당한 레벨까지만 연결해서 사용중입니다. 아직 특별하게 문제가 있거나 한건 아니라서 좀 더 볼려구요. 

    0
  • jun94
    30
    2020-05-23 20:06:58 작성 2020-05-23 20:07:27 수정됨

    초무쿤

    아 저도 처음에는 단방향으로 작성했다가 양방향을 지향하는게 좋다는 게시물들을 많이 봐서 양방향을 선택하게 됐네요'ㅁ'.  공부할겸 단방향으로도 작성해서 테스트 해봐야겠네요ㅎ... 답변 감사드립니다.


    시닙이

    add만으로도 추가할 수 있다고 하셨는데 

    cascadeType.ALL로 설정되어 있다는 전제하에

    child를 따로 persist하지 않고(객체 상태로만 생성 후 필드 초기화 가정)

    parent의 children에 add 메소드로 child 객체를 추가한 후 parent를 persist하면 

    데이터베이스에 자동으로 child데이터를 생성한다는 말씀이신가요?

    0
  • 시닙이
    850
    2020-05-23 22:01:20
    child에게 parent의 관계에 대해 add 를 시켜주게되고 트랜잭션이 끝나거나 영속성 컨텍스트가 종료될때 parent만 persist해주게 되어도 child들이 모두 insert가 됩니다. 
    0
  • jun94
    30
    2020-05-24 15:19:16

    시닙이

    아하.. 역시 적용된다는 거군요 감사합니다!!!

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.