UFO ET IT

JPA 컬렉션에 어떤 Java 유형을 사용하고 그 이유는 무엇입니까?

ufoet 2021. 1. 15. 07:40
반응형

JPA 컬렉션에 어떤 Java 유형을 사용하고 그 이유는 무엇입니까?


다음 컬렉션 유형 중 JPA 도메인 모델에서 사용하는 컬렉션 유형과 이유 :

  • java.util.Collection
  • java.util.List
  • java.util.Set

이것에 대한 몇 가지 기본 규칙이 있는지 궁금합니다.

업데이트 나는 a Set와 a 의 차이점을 알고 List있습니다. A List는 중복을 허용하고 순서가 Set있으며 중복 요소를 포함 할 수 없으며 순서를 정의하지 않습니다. JPA의 맥락에서이 질문을하고 있습니다. 정의를 엄격하게 따르는 경우 Set컬렉션이 관계형 데이터베이스에 저장되므로 중복을 가질 수없고 주문을 직접 정의한 경우 (예 : Java의 순서는 다음과 같습니다. List) 반드시 DB에 보존되지는 않습니다.

예를 들어, List구성 요소 라이브러리의 일부 구성 요소에 목록이 필요하기 때문에 대부분의 경우 유형을 사용하고 있습니다. 순서가 있거나 중복을 허용하기 때문이 아닙니다.


귀하의 질문에서 알 수 있듯이 핵심은 JPA가 아니라 도메인 입니다. JPA는 문제에 가장 잘 맞는 방식으로 사용할 수 있고 사용해야하는 프레임 워크입니다. 프레임 워크 (또는 그 한계) 때문에 차선책을 선택하는 것은 일반적으로 경고 종입니다.

세트가 필요하고 주문에 신경 쓰지 않을 때 Set. 어떤 이유로 순서가 중요한 경우 (순서 목록, 날짜 별 순서 등) List.

당신은 차이를 잘 알고있을 것 Collection, Set하고 List. 하나를 사용하는 유일한 이유는 사용자의 필요에 따라 다릅니다. 당신은 할 수 있습니다 당신의 API (또는 당신의 미래 자체) 컬렉션의 속성의 사용자와 통신하는 데 사용할 (미묘한 또는 암시 할 수있다).

이는 코드 전체에서 다른 컬렉션 유형을 사용하는 것과 똑같은 규칙을 따릅니다. Object또는 Collections모든 참조에 대해 사용할 수 있지만 대부분의 경우 더 구체적인 유형을 사용합니다.

예를 들어,를 볼 때 List어떤 방식 으로든 정렬되어 있으며이 경우 중복 항목이 허용되거나 관련이 없음을 알고 있습니다. 를 볼 때 Set일반적으로 중복이없고 특정 순서가 없을 것으로 예상합니다 (a가 아닌 경우 SortedSet). 를 볼 때 Collection일부 엔터티를 포함하는 것보다 더 많은 것을 기대하지 않습니다.

목록 순서에 대해 ... 예, 보존 할 수 있습니다. 그렇지 않고 그냥 사용하더라도 @OrderBy여전히 유용 할 수 있습니다. 기본적으로 타임 스탬프별로 정렬 된 이벤트 로그의 예를 생각해보십시오. 목록을 인위적으로 재정렬하는 것은 의미가 없지만 기본적으로 정렬되어 제공되는 것이 여전히 유용 할 수 있습니다.


세트 또는 목록 사용에 대한 질문은 제 생각에 훨씬 더 어렵습니다. 최소한 JPA 구현으로 최대 절전 모드 를 사용할 때 . 최대 절전 모드에서 목록을 사용하는 경우 중복이 존재할 수 있는 "백" 패러다임 으로 자동 전환됩니다 .

그리고 그 결정은 최대 절전 모드 실행 쿼리에 상당한 영향을 미칩니다. 여기에 약간의 예가 있습니다.

일반적인 다 대다 관계인 두 개의 엔티티, employeecompany가 있습니다. 이러한 엔터티를 서로 매핑하기 위해 JoinTable ( "employeeCompany"라고 부름)이 존재합니다.

두 엔티티 (회사 / 직원) 에서 데이터 유형 목록선택합니다.

따라서 CompanyXY 에서 직원 Joe제거 하기로 결정한 경우 hibernate는 다음 쿼리를 실행합니다.

delete from employeeCompany where employeeId = Joe;
insert into employeeCompany(employeeId,companyId) values (Joe,CompanyXA);
insert into employeeCompany(employeeId,companyId) values (Joe,CompanyXB);
insert into employeeCompany(employeeId,companyId) values (Joe,CompanyXC);
insert into employeeCompany(employeeId,companyId) values (Joe,CompanyXD);
insert into employeeCompany(employeeId,companyId) values (Joe,CompanyXE);

그리고 이제 질문 : 도대체 왜 최대 절전 모드가 해당 쿼리를 실행하지 않습니까?

delete from employeeCompany where employeeId = Joe AND company = companyXY;

대답은 간단합니다 (그의 블로그 게시물을 위해 Nirav Assar에게 많은 도움이됩니다). 할 수 없습니다 . 가방의 세계에서 모든 것을 삭제하고 나머지를 모두 다시 삽입하는 것이 유일한 방법입니다! 더 자세한 설명을 위해 읽어보십시오. http://assarconsulting.blogspot.fr/2009/08/why-hibernate-does-delete-all-then-re.html

이제 큰 결론 :

Employee / Company-Entities에서 List 대신 Set을 선택하면 해당 문제가 없으며 쿼리가 하나만 실행됩니다!

그리고 그 이유는 무엇입니까? 최대 절전 모드는 더 이상 백의 세계에 있지 않기 때문에 (아시다시피 세트는 중복을 허용하지 않음) 이제 하나의 쿼리 만 실행할 수 있습니다.

따라서 List와 Sets 사이의 결정은 적어도 쿼리 및 성능에 관해서는 그렇게 간단하지 않습니다!


나는 일반적으로 목록을 사용합니다. List API가 Set보다 훨씬 더 유용하고 다른 라이브러리와 호환됩니다. 목록은 반복하기 쉽고 일반적으로 대부분의 작업 및 메모리에 대해 더 효율적입니다.

관계가 중복을 가질 수없고 일반적으로 순서가 지정되지 않는다는 사실은 세트 사용을 요구하지 않아야합니다. 애플리케이션에 가장 유용한 콜렉션 유형을 사용할 수 있습니다.

하지만 모델에 따라 다르지만 포함 검사를 많이 수행하려는 경우 Set이 더 효율적입니다.

@OrderBy 또는 @OrderColumn을 사용하여 JPA에서 관계를 주문할 수 있습니다.

http://en.wikibooks.org/wiki/Java_Persistence/Relationships#Ordering을 참조하십시오 .

중복은 일반적으로 JPA에서 지원되지 않지만 ElementCollections와 같은 일부 매핑은 중복을 지원할 수 있습니다.


나는 사용한다:

  • 설정 : 컬렉션의 항목이 순서가없고 고유 한 경우
  • 목록 : 항목에 주문이있을 때

Netbeans로 엔티티를 생성 할 때 Collection을 일반 기본값으로 사용하는 것이 좋은 출발점이라고 생각합니다. 그러면 모델이 실제로 무엇인지 파악하고 더 많은 기능이 필요하면 쉽게 변경하고 하위 호환성을 유지할 수 있습니다.

참조 URL : https://stackoverflow.com/questions/4655392/which-java-type-do-you-use-for-jpa-collections-and-why

반응형