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 구현으로 최대 절전 모드 를 사용할 때 . 최대 절전 모드에서 목록을 사용하는 경우 중복이 존재할 수 있는 "백" 패러다임 으로 자동 전환됩니다 .
그리고 그 결정은 최대 절전 모드 실행 쿼리에 상당한 영향을 미칩니다. 여기에 약간의 예가 있습니다.
일반적인 다 대다 관계인 두 개의 엔티티, employee 및 company가 있습니다. 이러한 엔터티를 서로 매핑하기 위해 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
'UFO ET IT' 카테고리의 다른 글
포트란 : 정수 * 4 대 정수 (4) 대 정수 (종류 = 4) (0) | 2021.01.15 |
---|---|
node.js에서 console.log와 sys.puts의 차이점은 무엇입니까? (0) | 2021.01.15 |
타사 라이브러리의 Eclipse에서 중단 점을 설정하는 방법은 무엇입니까? (0) | 2021.01.14 |
실행 가능한 Java 프로그램을 어떻게 만듭니 까? (0) | 2021.01.14 |
자바 스크립트의 날짜 차이 (시간 무시) (0) | 2021.01.14 |