itsource

단방향 및 양방향 JPA 및 휴지 상태 연결의 차이점은 무엇입니까?

mycopycode 2022. 8. 14. 11:44
반응형

단방향 및 양방향 JPA 및 휴지 상태 연결의 차이점은 무엇입니까?

단방향 어소시에이션과 양방향 어소시에이션의 차이점은 무엇입니까?

db에서 생성된 테이블은 모두 같기 때문에 내가 발견한 유일한 차이점은 쌍방향 어소시에이션의 양쪽이 서로 참조하고 단방향은 참조하지 않는다는 것이다.

이것은 단방향 어소시에이션입니다.

public class User {
    private int     id;
    private String  name;
    @ManyToOne
    @JoinColumn(
            name = "groupId")
    private Group   group;
}

public class Group {
    private int     id;
    private String  name;
}

쌍방향 어소시에이션

public class User {
    private int     id;
    private String  name;
    @ManyToOne
    @JoinColumn(
            name = "groupId")
    private Group   group;
}
public class Group {
    private int         id;
    private String      name;
    @OneToMany(mappedBy="group")
    private List<User>  users;
}

차이점은 그룹이 사용자의 참조를 보유하고 있는지 여부입니다.

그래서 이게 유일한 차이점일까?어떤 것이 추천됩니까?

주요 차이점은 양방향 관계가 양방향으로 네비게이션액세스를 제공하므로 명시적인 쿼리 없이 다른 쪽에 액세스할 수 있다는 것입니다.또한 양방향에 캐스케이드 옵션을 적용할 수도 있습니다.

네비게이션 액세스는 특히 "1 대 다" 및 "다 대 다" 관계에서 항상 좋은 것은 아닙니다.상상해 보세요Group수천 개의 데이터를 포함하고 있습니다.Users:

  • 어떻게 접근하시겠습니까?이렇게 많은 사람들과 함께Users는 보통 약간의 필터링 및/또는 페이지 번호를 적용해야 합니다.그래서 쿼리를 실행할 필요가 있습니다(내게는 해킹처럼 보이는 수집 필터링을 사용하지 않는 한).일부 개발자는 이러한 경우 메모리에 필터링을 적용하는 경향이 있으며, 이는 명백히 성능에 좋지 않습니다.이러한 관계를 맺으면 이러한 종류의 개발자가 성능의 영향을 고려하지 않고 이를 사용하도록 장려할 수 있습니다.

  • 어떻게 새로 추가하시겠습니까?Users to theGroupHibernate는 다행히 관계를 유지할 때 관계의 소유측을 바라보기 때문에 설정만 할 수 있습니다.User.group단, 메모리 내의 오브젝트를 일관되게 유지하려면 다음 명령어를 추가해야 합니다.User로.Group.users. 그러나 이것은 Hibernate로 만들어 모든 요소를 가져옵니다.Group.users데이터베이스에서!

따라서 베스트 프랙티스의 권장 사항에 동의할 수 없습니다.사용 사례(양방향 탐색 액세스 필요)와 가능한 성능 영향을 고려하여 양방향 관계를 신중하게 설계해야 합니다.

다음 항목도 참조하십시오.

두 가지 주요 차이점이 있습니다.

어소시에이션 측에의 액세스

첫 번째는 어떻게 그 관계에 접근할 것인가에 관한 것입니다.단방향 어소시에이션의 경우 어소시에이션은 한쪽 끝에서만 네비게이트할 수 있습니다.

단방향의 경우@ManyToOne연관성, 즉 외부 키가 있는 자식 측에서만 관계에 액세스할 수 있습니다.

단방향의 경우@OneToMany어소시에이션이란, 외부 키를 관리하는 부모측에서만 접속할 수 있는 것을 의미합니다.

쌍방향의 경우@OneToMany연결은 부모 측과 자식 측 중 하나의 방법으로 연결을 탐색할 수 있습니다.

, 쌍방향 어소시에이션의 추가/삭제 유틸리티 방식을 사용하고, 양쪽이 올바르게 동기하고 있는 것을 확인할 필요가 있습니다.

성능

두 번째 측면은 퍼포먼스와 관련이 있습니다.

  1. 위해서@OneToMany, 단방향 어소시에이션은 쌍방향 어소시에이션만큼 잘 동작하지 않습니다.
  2. 위해서@OneToOnehibernate가 프록시를 할당할지 을 할당할지 여부를 알 수 없는 경우 쌍방향 어소시에이션에 의해 부모가 빠르게 취득됩니다.
  3. 위해서@ManyToMany, 수집 타입은, 보다 퍼포먼스가 뛰어나기 때문에 큰 차이를 가져옵니다.

이것이 유일한 차이점이라고 100% 확신할 수는 없지만, 가장 큰 차이점이다.또, 휴지 상태의 문서에서는, 쌍방향의 관련성을 설정하는 것을 추천합니다.

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/best-practices.html

구체적으로는:

쌍방향 어소시에이션 우선:단방향 어소시에이션은 쿼리하기가 더 어렵습니다.대규모 응용 프로그램에서는 거의 모든 연관성을 쿼리에서 양방향으로 탐색할 수 있어야 합니다.

저는 개인적으로 이 포괄적인 권고에 약간의 문제가 있습니다.제가 보기에는 아이가 부모에 대해 알아야 할 실질적인 이유가 없는 경우가 있는 것 같습니다(예를 들어, 주문 항목이 관련된 순서에 대해 알아야 하는 이유는 무엇입니까?). 하지만 저는 그 안에 상당한 시간적 가치가 있다고 생각합니다.그리고 쌍방향성은 사실 아무런 해가 되지 않기 때문에, 저는 그것을 고수하는 것이 그다지 불쾌하다고 생각하지 않습니다.

부호화에 관해서는, 애플리케이션이 JPA 사양 5(42 페이지)에 따라서 양쪽을 동기시키는 것을 담당하기 때문에, 쌍방향 관계를 실장하는 것이 보다 복잡하다.안타깝게도 사양에 제시된 예에서는 더 자세한 내용을 제공하지 않기 때문에 복잡성의 수준을 알 수 없습니다.

두 번째 수준의 캐시를 사용하지 않을 경우 트랜잭션 종료 시 인스턴스가 폐기되기 때문에 일반적으로 관계 메서드가 올바르게 구현되지 않는 것은 문제가 되지 않습니다.

두 번째 수준의 캐시를 사용하는 경우 잘못 구현된 관계 처리 방식으로 인해 어떤 것이라도 손상된 경우 다른 트랜잭션에서도 손상된 요소가 확인됨을 의미합니다(두 번째 수준의 캐시는 글로벌).

쌍방향 관계가 올바르게 구현되면 쿼리 및 코드가 단순해질 수 있지만 비즈니스 로직 측면에서 실제로 의미가 없는 경우에는 사용하지 마십시오.

언급URL : https://stackoverflow.com/questions/5360795/what-is-the-difference-between-unidirectional-and-bidirectional-jpa-and-hibernat

반응형