문제

어떻게 사용할 수 있습니 JTable 를 표시 및 편집하는 특성에 대한 속성 엔티티에서 검색 entity,특성,가치(EAV)저장(형 DBMS)?

이것이 질문을 많이 가능한 답변,시 보 요구 사항을 나는 아래하기 전에 응답한다.

나는 약속 투표로 정답을 표시하는 당신이 읽고 이해하는 모든 일이(만큼 그들은 완전히 어리석은).


사용자의 요구를 할 수 있습니다:

  1. 필터/검색 엔티티에 의해 그들의 특성

  2. 선택하는 특성을 보여주고(열)

  3. Sort 엔티티에 의해 선택된 특성

  4. 특성 값을 편집

  5. 할 작업에 선택한 요소의

  6. (선택) 는 능력을 저장하기 위한 나중에 사용할 수 있습니다.


시스템 요구 사항:

  1. 수체:필요 확장하 100K+독특한 엔티티

  2. 속성:사용자를 추가할 수 있고 정의를 새로운 특성,시스템을 처리할 수 있어야 합니다 이

  3. 내부 저장소:H2 데이터베이스(이미 설계되었),소 JDBC

  4. 메모리:모든 것이 맞는 것입니다,그래서 이런 요구를 풀서 쿼리 DBMS

  5. 성능:이 최소화 번호를 쿼리하는 데 필요한 DBMS(한 쿼리당성 확인,그리고 나는 형태로 1 쿼리 테이블당 전망,하지만 그것은 빨).

  6. 쿼리:한 질문은 아래와 같아야 한다를 생성하는 데 필요한 목록의 엔티티와 일치하는 검색/필터가 있습니다.그렇지 않으면 엄청난 성능을 빨.

  7. 재사용 데이터:지 않을 쿼리를 다시 또 다시 정렬하고 전체 목록을 때 열가 추가됩니다.


것을 내가 보았다:

  1. 윤 목록 라이브러리

    • 장점:

      • 에 대해 유연한 열 처리
      • 쉽게 구현종/필터의 엔티티
      • 에 대해 유연한 열 표시 형식 및 편집
    • 단점:

      • 한당 개체 entity(면 객체가 복잡한,오버헤드 메모리가 되는 심각한 메모리 문제입니다!)
      • 개체에 대한 책임의 모든 기능을...하지만 객체 간단해야 메모리에 대한 이유
      • 어떻게 지원 사용자 선택 가능한이 없는 열 HashMap 한 모든 기업이 목적입니까?
  2. 을 확장하 AbstractTableModel 를 지도에서 데이터 JDBC ResultSet 을 행 열

    • 장점:
      • 페이징의 결과를 피 메모리 문제
      • 찾기/필터링은 SQL 에서 직접
      • 메모리 친절하고,사람으로 만들지 않는 객체 행별
    • 단점:
      • 을 구현하는 사용자 정의 열 및 정렬은 고통을(표 헤더를 렌더러,관리하는 종류 열기,etc.)!
      • 아마를 쓰기 사용자 지정 JTableColumnModel 너무,그리고이 지저분하다!
      • 가를 조작하는 SQL,많은 경우 그래서 DB 스키마에 변경이 있을 다시 작성하는 여러 개의 코드!
      • 을 유지하기 위해 열심히 entity ID 정보
  3. ORM

    • 장점:
      • 계 지도 DB 행하는 개체
      • 제공하는 객체 관리
    • 단점:
      • 최악의 가능한 솔루션을 위한 entity-속성-가치 모델
      • 을 알아보기 및 쓰기 ORM 에 코드를 추가하는 DBMS 및 자바 코드!
      • 체할 수 있가 숫자의 특성,ORM 만 좋은 정체되는 제한된 객체 속성
      • 유연성을 잃/속도의 사용자 정의 SQL

더 나은 옵션이게,또는 영리한 방법을 윤이 나는 목록 또는 사용자 정의 테이블 모니까?

나는 완전히 폐기 ORM 옵션으로 이미 이 때문에 얼마나 심하게 일치하 EAV 저장합니다.

도움이 되었습니까?

해결책

난 당신의 최선의 선택으로 이동하는 것입니다'확장 AbstractTableModel 양식을 가진 지도에서 데이터 JDBC ResultSet 기 때문에'

  • Java6JTable 내장되어 분류를 지원하지 않는 정말로 구현해야 합니다.
  • 는 경우에 당신을 디자인하는 모델을 신중하게,당신은 살아남을 수있는 몇 가지 스키마에 변경합니다.코드를 분명하게 허용하기 위해 자신을 변경하는 경우 쉽게 당신이 필요합니다.
  • 당신은 다시 작성 변경 사항을 어쨌든.사용하는'저장'버튼을 일괄 업데이트할 수 있도록도 있습니다 당신의 성능입니다.
  • 무시할 수 있습 TableCellEditor 공급 combobox 신의 기본 텍스트 편집기입니다.
  • 하지 않는 모든 작업을 수행하려고 편집에서 한 테이블.가로 구분된 의미에 대한 항목이 있습니다.
  • 추가/제거할 수 있습의 열을 JTable 을 수 있습니다.그냥 fireTableModelChanged()새로운 열에 표시 됩

편집: 하나는 내가 미친 것을 할 것을 맞춤 구성 요소 및 하시는 모든 렌더링 자신이 수행하는 편집으로 운영뿐만 아니라 배치 JTextField 및 JComboBox.

Edit2: 에 따라 귀하의 의견.저장할 위치를 선택 항목하기 전에 당신을 수행합니다.()호출합니다.Btw,나는 생각하지 않는 전화를 다시 정렬하거나는 선택 아무 문제가 없었습니다.

는 경우에 당신은 열을 추가,당신을 가져올 필드 키와 값을 새로 열만 있습니다.에서 표시하는 열이 있습니다.다음 숨기 충전 배경과 스왑 모델을 할 때 그것은 완료됩니다.이것은 실질적으로 작동하에서 여러 결과에서 같은 시간에 하나의 테이블.

을 제거하는 것은 쉽지 않 값을 표시하는 열이 있습니다.

Edit3:

DefaultRowSorter 아닌가 깊다.유지를 다시 인덱스 테이블에 대한 기록합니다.그래서 때 JTable 요청한 10 행 rowsorter 검사의 제 10 항목의 인덱스 테이블과를 검색하는 indexth 요소에서 실제 모델이다.

도가 많을 경우의 동일한 문자열에 모델을 사용한 간단한 지도열할 때 캐시 데이터 쿼리 데이터베이스에서.이 방법의 중복되는 문자열체할 수 있습 GC-d 니다.

Edit4:

나는 쿼리를 새로운 분야의 지도하는 키 값이 기본 모델의 목록을 포함하의 지도하는 키 값입니다.그때 사용하는 것 getValue()구현을 반환하는 값에서 하나는 주의 데이터 소스에서 이러한 추가도 수 있습니다.내가 조회 행의 주요 기본 모델에서 사용하여 검색이 실제 값을 추가적인 지도입니다.(Btw.평판을 얻에서 허용된 응답이 적용되지 않습니다 매일 제한.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top