Frage

Wie kann ich eine JTable anzuzeigen und bearbeiten Attributeigenschaften für Entitäten von einer Entität, Attribut-Wert (EAV) zu speichern (ein relationales DBMS) abgerufen?

Ich weiß, das ist eine Frage, mit vielen möglichen Antworten, also bitte Blick auf den Anforderungen Ich habe unten, bevor er antwortet.

Ich verspreche Antworten zu wählen, die Sie gelesen haben zeigen und verstehen die ganze Sache (solange sie nicht völlig dumm sind).


Der Benutzer muss in der Lage sein:

  1. Filter / Search-Elemente durch ihre Attribute

  2. Wählen Sie, welche (als Spalten) zeigen Attribute

  3. Sortieren von Entitäten ausgewählt Attributen

  4. Bearbeiten Attributwerte

  5. Sie Operationen auf ausgewählten Elemente

  6. (Optional) Ability Ansicht zur späteren Verwendung speichern.


Systemanforderungen:

  1. Die Anzahl der Einheiten: muss 100K + einzigartige Einheiten, Scale-up

  2. Attribute: Benutzer können neue Attribute hinzufügen und definieren, System sollte diese in der Lage zu handhaben

  3. Basiswert Lagerung: H2-Datenbank (bereits entworfen), die Kommunikation von JDBC

  4. Speicher: nicht alles paßt, so irgendwie von DBMS-Abfragen zu ziehen braucht

  5. Performance: solle Anzahl der Abfragen minimieren, um DBMS benötigen (eine Abfrage pro Attribut OK, und ich habe ein Formular mit 1 Abfrage pro Tabellenansicht, aber es saugt)

  6. .
  7. Abfragen: ONE Abfrage erforderlich sein sollte Liste von Einheiten zu erzeugen, um eine Suche / Filter entsprechen. Ansonsten massive Leistung saugt.

  8. Daten wiederverwenden: sollte nicht erneut Abfrage oder neu sortiert die gesamte Liste, wenn Spalte hinzugefügt wird.


Dinge, die ich habe sieht:

  1. Glasierte Listen Bibliothek

    • Vorteile:

      • Flexible über Spalte Handhabung
      • Einfache Art / Filter von Einheiten zu implementieren
      • Flexible über Spalte Anzeigeformat und Bearbeitung
    • Nachteile:

      • Ein Objekt pro Einheit (wenn Objekte komplex sind, Speicher-Overhead zu einem ernsthaften Speicherproblem!)
      • Objekt verantwortlich für alle Funktionen ... aber Objekte sollten für Speichergründen einfach
      • Wie kann ich vom Benutzer wählbaren Spalten ohne HashMap für JEDEN Entitätsobjekt unterstützen?
  2. Erweitern Abstract Daten von einem JDBC ResultSet Zeilen abzubilden, Spalten

    • Pros:
      • Paging der Ergebnisse vermeidet Speicherproblem
      • Suchen / Filtering ist direkt in SQL
      • Memory-freundlich, muss nicht pro-Zeile ein Objekt machen
    • Nachteile:
      • Implementierung eigene Spalten & Sortieranlage einen Schmerz (Tabellenkopf-Renderer, sortieren Spalten und um die Verwaltung, usw.) ist!
      • Wahrscheinlich zu benutzerdefinierten JTableColumnModel schreiben müssen, und das wird chaotisch!
      • Hat SQL viel, so dass, wenn DB-Schemaänderungen zu manipulieren, mehrere Teile des Codes neu zu schreiben haben!
      • Hard Einheit ID info
      • halten
  3. ORM

    • Pros:
      • passend DB Reihen auf Objekte abzubilden
      • Stellt Objektmanagement
    • Nachteile:
      • schlimmstmögliche Lösung für Entity-Attribut-Wert-Modell
      • Haben Sie ORM-Code zusätzlich zu DBMS und Java-Code!
      • lernen und schreiben
      • Entities haben können jeder Anzahl von Attributen, ORM ist nur dann gut mit statischen, begrenzte Objektattribute
      • Los Flexibilität / Geschwindigkeit von benutzerdefinierten SQL

Gibt es eine bessere Möglichkeit, die ich verpasst, oder einige clevere Art und Weise Verglaste Listen oder benutzerdefinierte Tabelle Modell leichter zu machen?

Ich habe total ORM als Option schon weggeworfen, weil, wie schlecht abgestimmt ist Lagerung EAV.

War es hilfreich?

Lösung

Ich denke, die beste Wahl mit gehen ‚erweitern Abstract mit Form Kartendaten von einem JDBC ResultSet‘, weil

  • Java 6 JTable hat in Sortier Unterstützung gebaut, so dass Sie wirklich nicht, dass implementieren müssen.
  • Wenn Sie Ihr Modell sorgfältig entwerfen, Sie könnten einige Schemaänderungen überleben. klar Code zu ermöglichen, sich Änderungen leichter zu machen, wenn Sie benötigen.
  • Du musst sowieso Änderungen zurückschreiben. Verwenden Sie eine Schaltfläche ‚Speichern‘ und Batch-Update könnte sogar Ihre Leistung helfen.
  • Sie können Table außer Kraft setzen Combobox anstelle des Standard-Texteditor zu liefern.
  • Versuchen Sie nicht alle bearbeiten in einer Tabelle zu tun. Haben getrennt Mittel zum Eintrag Schaffung etc.
  • Sie können Spalten hinzufügen / entfernen zu JTable zur Laufzeit. Nur fireTableModelChanged () und die neue Spalte wird sichtbar

Edit:. Eine verrückte Sache, die ich tun würde, eine eigene Komponente zu erstellen und alle Rendering selbst tun und die Bearbeitungsvorgänge mit gut platzierten JTextField und JComboBox durchführt

Edit2: auf Ihrem Kommentar Basierend. Speichern Sie die Position des ausgewählten Elements, bevor Sie das Feuer ... () -Aufruf tun. Btw, ich glaube nicht, das Gespräch die Sortierung oder die Auswahl zurücksetzt - hatte kein Problem damit.

Wenn Sie eine Spalte hinzufügen, können Sie nur das Schlüsselfeld holen und die Werte für die neue Spalte nur. Bringen Sie diese in der Spalte. Dann machen Sie eine versteckte komplette Nachladen im Hintergrund und tauschen Sie das Modell, dass, wenn es fertig ist. Das funktioniert praktisch aus mehreren Result zugleich in einer Tabelle.

Das Entfernen ist einfach, wie Sie die Werte für diese Spalte zeigen können.

Edit3:

DefaultRowSorter ist nicht so tief. Es unterhält eine Neuindizierung Tabelle für Ihre Unterlagen. Also, wenn JTable für die 10. Reihe fragt, überprüft der rowsorter seinen 10. Eintrag der Indextabelle und ruft, dass indexth Element aus Ihrem aktuellen Modell.

Auch wenn Sie viele identischen Strings in Ihrem Modell eine einfache Karte von String zu String-Cache verwenden, wenn Sie die Daten aus der Datenbank abfragen. Auf diese Weise die Tonnen von redundanten String-Objekte können GC-d werden sofort.

Edit4:

würde ich das neue Feld in eine Karte von Schlüssel-Wert abfragen und habe mein primäres Modell eine Liste der Karte Schlüssel zum Wert enthält. Dann würde ich eine getValue () Implementierung verwendet werden, die von dem Wert zurückzugibt entweder der primären Datenquelle von diesen zusätzlichen Karten auf Anfrage. Ich würde den Schlüssel des Zeilen Nachschlag aus dem primären Modell und verwenden, die den Ist-Wert aus den zusätzlichen Karten abzurufen. (Btw. Ruf von akzeptierten Antworten gewonnen werden, unterliegen nicht dem Tageslimit.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top