2 ComboBox(en)

mihe7

mihe7

Top Contributor
Das heißt für die ComboBox, dass die sie doppelt befüllt wird. Das könnte ich mit Löschen und dann Befüllen lösen, aber dann fehlt der erste Wert mit "Bitte auswählen".
Das kannst Du auch lösen, indem Du beim Befüllen nicht direkt die ComboBox befüllst, sondern ein z. B. DefaultComboBoxModel und dann das Model der ComboBox ersetzt.

Statt
Java:
    private void fillComboBoxGermanBranches() {
        try {
            for (String label : loadGermanBranches()) {
                jComboBoxFilialenDeutschland.addItem(label);
            }
        } catch (SQLException e) {
            e.printStackTrace();
            JOptionPane.showMessageDialog(null, e);
        }
    }
hättest Du dann z. B.
Java:
    private void fillComboBoxGermanBranches() {
        try {
            DefaultComboBoxModel<String> model = new DefaultComboBoxModel<>();
            for (String label : loadGermanBranches()) {
                model.addElement(label);
            }
            jComboBoxFilialenDeutschland.setModel(model);
        } catch (SQLException e) {
            e.printStackTrace();
            JOptionPane.showMessageDialog(null, e);
        }
    }

EDIT: model in der for-Schleife war abhanden gekommen. Hinzugefügt

Zum Screenshot: jetzt verstehe ich, worum es geht. Ich würde Dir dringend(!) empfehlen, den Code zu restrukturieren.
 
M

maGG

Bekanntes Mitglied
Meine Füll-Methode sieht aktuell so aus:
Java:
    private void fillComboBoxGermanBranches() throws SQLException {
        String sql = "SELECT * FROM Filialen_Deutschland";
        try (PreparedStatement pst = conn.prepareStatement(sql)) {
            try (ResultSet rs = pst.executeQuery()) {
                while (rs.next()) {
                    String label = rs.getString("LABEL");
                    //jComboBoxFilialenDeutschland.removeAllItems();
                    //jComboBoxFilialenDeutschland.addItem("Bitte auswählen");
                    jComboBoxFilialenDeutschland.addItem(label);
                }
            }
        }
    }
Was meinst du mit restrukturieren? Das ich es noch mehr aufteilen sollte auf verschiedene Methoden und diese auslagere in Klassen? Was wäre denn der Vorteil davon? Leider wird dieses Programm vermutlich nie wieder jemand anfassen außer mir. In der Firma in der ich als studentische Aushilfe arbeite kann niemand programmieren und die Anforderungen sind extrem gering bzw. habe ich ein sehr begrenztes Zeitbudget (30h lol) und derartige Bemühungen wird vermutlich am Ende niemand hier schätzen bzw. müsste ich diese in meiner Freizeit machen. :/
Oder meinst du etwas anderes damit?
 
mihe7

mihe7

Top Contributor
Meine Füll-Methode sieht aktuell so aus:
Dann sieht sie halt in Zukunft wie folgt aus :)
Java:
    private void fillComboBoxGermanBranches() throws SQLException {
        String sql = "SELECT * FROM Filialen_Deutschland";
        try (PreparedStatement pst = conn.prepareStatement(sql)) {
            try (ResultSet rs = pst.executeQuery()) {
                DefaultComboBoxModel<String> model = new DefaultComboBoxModel<>();
                model.addItem("Bitte auswählen");
                while (rs.next()) {
                    String label = rs.getString("LABEL");
                    model.addElement(label);
                }
                jComboBoxFilialenDeutschland.setModel(model);
            }
        }
    }
Das ich es noch mehr aufteilen sollte auf verschiedene Methoden und diese auslagere in Klassen? Was wäre denn der Vorteil davon?
Antworte ich gleich noch darauf.
 
mihe7

mihe7

Top Contributor
Hat länger gedauert. Der Vorteil davon ist, dass Du a) Struktur in den Code bekommst und b) Klassen und Objekte leichter wiederverwenden kannst.

Zum Beispiel: die Tabelle im zweiten Fenster und die ComboBox im ersten Fenster sind unterschiedliche Ansichten derselben Objektliste. Wenn Du diese in einem "Repository" separat darstellst und dieses in beiden Fällen verwendest, weiß das Repository, wann sich etwas geändert hat. Daher kann es interessierte Objekte (Observer) über derlei Änderungen informieren, die ihrerseits entsprechend darauf reagieren können.

Anderes Beispiel: durch bessere Abstraktion kannst Du Code sparen. So unterscheiden sich die verschiedenen ComboBoxen ja nur in der Tabelle, die verwendet wird.

Aber, wenn Du so zurechtkommst und es Dir keiner dankt -> vergiss es.
 
M

maGG

Bekanntes Mitglied
Achso, verstehe.

Wie kann ich denn meine Methoden "auslagern"? Bisher habe ich das teilweise mit anderen Klassen gemacht und diese dann mit Konstruktoraufruf in meiner Hauptklasse eingebunden. Aber wenn ich jetzt eine neue Klasse "LoadSQL"erstelle und in dieser all meine Methoden mit SQL Anweisungen schreiben möchte, dann geht das bisher nicht. Die Methoden funktionieren ja in Hauptklasse schon, mit einem simplen Copy&Paste in LoadSQL ist es aber wohl nicht getan - scheinbar findet es die Methode dann nicht mehr. Könnte das an einem fehlenden Import liegen? (Die Klasse befindet sich im selben package wie meine Hauptklasse "GUI" - benutze Netbeans)
 
mihe7

mihe7

Top Contributor
Nein, so einfach geht das natürlich nicht, weil die Methoden immer noch stark an das UI gebunden sind. Du müsstest sie erst etwas umschreiben (s. Kommentar #31), so dass sie unabhängig vom UI Ergebnis liefern. In der Regel schreibt man sich ein Repository und bindet das UI daran.
 
M

maGG

Bekanntes Mitglied
Nein, so einfach geht das natürlich nicht, weil die Methoden immer noch stark an das UI gebunden sind. Du müsstest sie erst etwas umschreiben (s. Kommentar #31), so dass sie unabhängig vom UI Ergebnis liefern. In der Regel schreibt man sich ein Repository und bindet das UI daran.
Ja die Methoden habe ich schon tesweise mal geändert, d.h. das ich z.B. GUI-Elemente als übergabe Paramenter allgemein deklariert habe. Also z.B. JComboBox box1 ... und dann setze ich beim Aufruf der Methode entsprechende Comboboxen ein. Das Problem entsteht also nicht in meiner neuen Klasse (da wird nix rot angezeigt), sondern beim Aufruf in der Hauptklasse. (scheinbar findet er meine Methode nicht). Ich weiß aber leider nicht warum
 
M

maGG

Bekanntes Mitglied
Nein, das UI-Elemente haben dort nichts verloren.
Das ist aber glaub die einzige Möglichkeit das Ganze auf 2 Methoden zu beschränken. Wenn ich es so mache, wie du es vorgeschlagen hast, brauche ich noch eine dritte Methode. Objektorientiert zu programmieren, um möglichst Copy&Paste zu vermeiden verstehe ich und finde ich sinnvoll. Das andere kann ich nicht ganz nachvollziehen, evtl. fehlt mir da die Erfahrung im Bereich Softwareprogrammierung. Aktuell scheint mir dass das Ganze nur unnötig zu verkomplizieren :O

Trotzdem danke für deine Hilfe! :)
 
M

maGG

Bekanntes Mitglied
Hmm ok, also ich hab mal recherchiert; scheinbar kann man in Java gar keine Methoden auslagern, jedenfalls nicht im herkömmlichen Sinne. Damit meine ich folgendes:

Hauptklasse {
Methode 1{ Anweisungen... }
}

=>

Hauptklasse {
Methode 1;
}
ausgelagerteKlasse {
Methode 1{ Anweisungen... }
}

Alle Dinge die man in Google dazu findet sind Beispiele, die nicht zielführend sind oder Forenbeiträge von Leute, die ähnliche Fragen haben wie ich und wo es keine Lösung gibt. Die Aufteilung in #31 funktioniert auch nicht bei mir. Sobald ich eine Methode in eine andere Klasse stecke findet er sie nicht mehr, auch mit Erben nicht. Es sei denn ich schreibe die Methode als allgemeinen Konstruktor. Dann müsste ich aber für jede Methode eine eigene Klasse schreiben; was noch viel mehr Arbeit ist und alles noch unübersichtlicher macht, weil sonst müsste ich etwa 100 neue Klasse schreiben. Oder habe ich dabei etwas übersehen? Langsam bin ich echt genervt von Java... :;O
 
mihe7

mihe7

Top Contributor
Im Prinzip ist das ganz einfach: Du schreibst Dir Repository-Klassen, die dazu dienen, dem Gros der Anwendung eine vom Speichermedium unabhängige Schnittstelle anzubieten, um auf Entities zuzugreifen.

Zum Beispiel kannst Du ein BranchRepository schreiben, das "alles" abdeckt, was unmittelbar mit Filialen zu tun hat. Das könnte etwa so aussehen:
Java:
class BranchRepository {
    public enum Location {
        DOMESTIC, FOREIGN
    }

    private static final EnumMap<Location, String> queries = new EnumMap<>(Location.class);
    static {
        queries.put(Location.DOMESTIC, "SELECT * FROM Filialen_Deutschland");
        queries.put(Location.FOREIGN, "SELECT * FROM Filialen_Ausland");
    }

    private Connection conn;

    public BranchRepository(Connection conn) {
        this.conn = conn;
    }

    public List<String> findNames(Location where) {
        String sql = queries.get(where);
        try(PreparedStatement pst = conn.prepareStatement(sql)){
            try(ResultSet rs = pst.executeQuery()){
                List<String> result = new ArrayList<>();
                while(rs.next()){
                    result.add(rs.getString("LABEL"));
                }
                return result;
            }
        }
    }

    public List<Branch> findAll() { ... }
    public List<Branch> findByLocation(Location where) { ... }
    // usw.
}

Branch wäre dabei natürlich eine Klasse, die eine Filiale darstellt. Die findNames-Methode entspricht der Methode loadGermanBranches aus Kommentar #31. Ich habe sie nur ein wenig abstrakter gestaltet. Natürlich kannst Du auch konkretere findGermanBranches und findForeignBranches oder ähnliche Methoden implementieren.

Der Punkt hierbei ist: diese Klasse hat genau eine Aufgabe (das "Zeug" aus der DB laden und ggf. in der DB speichern) und absolut nichts mit einem User-Interface zu tun.

Dem UI werden dann z. B. solche Repositories mitgegeben. Dann kann dieses einfach darauf zugreifen. Das würde dann in einer Methode wie fillComboBoxGermanBranches() aus Kommentar #31 entsprechen.
 
M

maGG

Bekanntes Mitglied
mihe7

mihe7

Top Contributor
Also einfach finde ich das überhaupt nicht! Vielen Dank für die Mühe! Ich muss mir nochmal anschauen was ein enum und eine EnumMap. So versteh ich geradenur Bahnhof.
Ich speichere die zwei SELECTs einfach in einer Map, damit ich mir eine Methode in der öffentlichen Schnittstelle spare. Du kannst, wie bereits erwähnt, natürlich auch zwei Methoden schreiben.

Java:
    public List<String> findGermanNames() { 
        return findNames("SELECT * FROM Filialen_Deutschland");
    }

    public List<String> findForeignlNames() {
        return findNames("SELECT * FROM Filialen_Ausland");
    }

    private List<String> findNames(String sql) {
        try(PreparedStatement pst = conn.prepareStatement(sql)){
            try(ResultSet rs = pst.executeQuery()){
                List<String> result = new ArrayList<>();
                while(rs.next()){
                    result.add(rs.getString("LABEL"));
                }
                return result;
            }
        }
    }

Wofür ich "private Connection conn;" bringt ist mir auch noch ein Rätsel.
Beim Erzeugen des Repositories gibst Du die zu verwendende Verbindung zur DB an. Das Repository interessiert sich also prinzipiell nicht dafür, wo die Verbinung herkommt, welcher Treiber verwendet wird oder welches DBMS im Einsatz ist (hier gilt allerdings die Einschränkung, dass der SQL-Dialekt passen muss). Willst Du also DB tauschen, brauchst Du an diesem Code nichts mehr zu ändern.
 
M

maGG

Bekanntes Mitglied
Ok, cool! Vielen lieben Dank!

Verstehe ich das richtig, dass ich in meiner Hauptklasse dann sowas schreiben müsste?

Java:
private void fillComboBoxGermanBranches(){
    for(String label: findNames(BranchRepository.Location.DOMESTIC)){
        JComboBoxFilialenDeutschland.addItem(label);
    }
}

Da kommt bei mir gerade "cannot find Symbol" hmmm extends GUI habe habe ich schon bei der Repository Klasse im Kopf geschrieben. Oder was hab ich falsch gemacht? o_O
 
mihe7

mihe7

Top Contributor
Verstehe ich das richtig, dass ich in meiner Hauptklasse dann sowas schreiben müsste?
Fast. Du musst in Deinem UI schon eine Instanz Deines Repositories verwenden (daher bekommst Du auch die Fehlermeldung)

Java:
private BranchRepository repos; // Achtung: das muss irgendwo noch initialisiert werden 

private void fillComboBoxGermanBranches(){
    // hier dann repos.findNames:
    for(String label: repos.findNames(BranchRepository.Location.DOMESTIC)){
        JComboBoxFilialenDeutschland.addItem(label);
    }
}

Kannst Du maven-Projekte bauen? Dann schustere ich Dir mal ein lauffähiges Programm zusammen.

hmmm extends GUI habe habe ich schon bei der Repository Klasse im Kopf geschrieben
Nein, GUI taucht im Repository nicht auf :)
 
M

maGG

Bekanntes Mitglied
Nein, habe Maven noch nie benutzt. Hieße das ich müsste ein neues Projekt erstellen und dieses dann teilen?

Erm mist hab ne NullPointerException haha

Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at signatur.GUI.fillComboBoxGermanBranches2(GUI.java:1155)
    at signatur.GUI.<init>(GUI.java:156)
    at signatur.GUI$95.run(GUI.java:5114)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
 
mihe7

mihe7

Top Contributor
Nein, habe Maven noch nie benutzt. Hieße das ich müsste ein neues Projekt erstellen und dieses dann teilen?
Was heißt teilen? Du benutzt ja hoffentlich eine IDE, welche wäre das denn?

Erm mist hab ne NullPointerException haha
Ich vermute mal ganz stark, dass Du die Variable repos nicht gesetzt hast und daher beim Zugriff darauf eine NPE geworfen wird (was steht denn in der genannten Zeile 1155?)
 
M

maGG

Bekanntes Mitglied
Was heißt teilen? Du benutzt ja hoffentlich eine IDE, welche wäre das denn?
Ich benutze Netbeans ;) oder worauf wolltest du hinaus wegen Maven?

da steht:
Java:
//Zeile 1555
for(String label: repos.findNames(BranchRepository.Location.DOMESTIC)){
und repos habe ich ziemlich weit oben so deklariert:
Java:
private BranchRepository repos;
oder meinst du was anderes mit "gesetzt"?
 
mihe7

mihe7

Top Contributor
oder meinst du was anderes mit "gesetzt"?
Ja, Du hast die Variable nur deklariert aber nicht initialisiert (standardmäßig werden Referenzen mit null initialisiert).

Du musst auch ein BranchRepository-Objekt erzeugen.

Wo bekommst Du denn Deine Connection her? Wird die bei Dir in der GUI-Klasse aufgebaut und bekommt die GUI-Klasse die Connection übergeben?

Ich benutze Netbeans ;) oder worauf wolltest du hinaus wegen Maven?
NetBeans ist OK. Damit (und eigentlich sollte das mit jeder IDE funktionieren) kannst Du Maven-Projekte öffnen. Mal schauen, vielleicht komme ich noch dazu, eine kleine Demo zu basteln. Sollte ja kein großer Akt sein.
 
M

maGG

Bekanntes Mitglied
Wo bekommst Du denn Deine Connection her? Wird die bei Dir in der GUI-Klasse aufgebaut und bekommt die GUI-Klasse die Connection übergeben?
Achso, stimmt das könnte echt der Grund sein. Im Moment so:

Java:
//im Konstruktor
public GUI(){
    //...
    ConnectDB();
    //...
}

Connection conn = null;

public Connection ConnectDb() {
    try {
        Class.forName("org.sqlite.JDBC");
        //die Datenbank soll später übers Internet zugänglich sein
        conn = DriverManager.getConnection("jdbc:sqlite:" + System.getProperty("user.home") + "/Desktop/Adressen.db");
        return conn;
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, e);
        return null;
    }
}
 
mihe7

mihe7

Top Contributor
Ändere mal Deinen Konstruktor
Java:
public GUI() {
  // ...
  ConnectDB();
  repos = new BranchRepository(conn);
}
 
M

maGG

Bekanntes Mitglied
Dank dir! Leider habe ich jetzt ein anderen Error:


Code:
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: GC overhead limit exceeded
    at java.util.HashMap.newNode(HashMap.java:1742)
    at java.util.HashMap.putVal(HashMap.java:630)
    at java.util.HashMap.put(HashMap.java:611)
    at java.beans.ChangeListenerMap.add(ChangeListenerMap.java:91)
    at java.beans.PropertyChangeSupport.addPropertyChangeListener(PropertyChangeSupport.java:117)
    at java.awt.Component.addPropertyChangeListener(Component.java:8262)
    at java.awt.Container.addPropertyChangeListener(Container.java:3599)
    at javax.swing.plaf.basic.BasicLabelUI.installListeners(BasicLabelUI.java:344)
    at javax.swing.plaf.basic.BasicLabelUI.installUI(BasicLabelUI.java:326)
    at javax.swing.JComponent.setUI(JComponent.java:666)
    at javax.swing.JLabel.setUI(JLabel.java:261)
    at javax.swing.JLabel.updateUI(JLabel.java:275)
    at javax.swing.JLabel.<init>(JLabel.java:164)
    at javax.swing.JLabel.<init>(JLabel.java:235)
    at javax.swing.DefaultListCellRenderer.<init>(DefaultListCellRenderer.java:92)
    at javax.swing.DefaultListCellRenderer$UIResource.<init>(DefaultListCellRenderer.java:344)
    at javax.swing.plaf.basic.BasicLookAndFeel$2.createValue(BasicLookAndFeel.java:611)
    at javax.swing.UIDefaults.getFromHashtable(UIDefaults.java:231)
    at javax.swing.UIDefaults.get(UIDefaults.java:161)
    at javax.swing.MultiUIDefaults.get(MultiUIDefaults.java:64)
    at javax.swing.UIManager.get(UIManager.java:955)
    at javax.swing.plaf.basic.BasicListUI.installDefaults(BasicListUI.java:788)
    at javax.swing.plaf.basic.BasicListUI.installUI(BasicListUI.java:881)
    at javax.swing.JComponent.setUI(JComponent.java:666)
    at javax.swing.JList.setUI(JList.java:523)
    at javax.swing.JList.updateUI(JList.java:538)
    at javax.swing.JList.<init>(JList.java:433)
    at javax.swing.plaf.basic.BasicComboPopup$1.<init>(BasicComboPopup.java:487)
    at javax.swing.plaf.basic.BasicComboPopup.createList(BasicComboPopup.java:487)
    at javax.swing.plaf.basic.BasicComboPopup.<init>(BasicComboPopup.java:332)
    at javax.swing.plaf.basic.BasicComboBoxUI.createPopup(BasicComboBoxUI.java:442)
    at com.sun.java.swing.plaf.windows.WindowsComboBoxUI.createPopup(WindowsComboBoxUI.java:371)
 
mihe7

mihe7

Top Contributor
D. h. dass der Garbage Collector unverhältnismäßig viel Zeit benötigt um unverhältnismäßig wenig Speicher freizugeben. D. h. in der Regel, dass Du irgendwo massenhaft temporäre Objekte erzeugst oder z. B. die JVM zu wenig Heap zugewiesen bekommen hat.
 
M

maGG

Bekanntes Mitglied
D. h. dass der Garbage Collector unverhältnismäßig viel Zeit benötigt um unverhältnismäßig wenig Speicher freizugeben. D. h. in der Regel, dass Du irgendwo massenhaft temporäre Objekte erzeugst oder z. B. die JVM zu wenig Heap zugewiesen bekommen hat.
Danke. Ok, gibts da eine Möglichkeit das zu checken, also ob soviele temporäre Objekte erzeugt werden. Wenn ich die Füllmethode über die Repository Klasse tätige, dann komm der Fehler. Wenn ich sie auskommentiere und mein alten Code nehme schafft es das Programm. Ist das nicht widersprüchlich? Die Anzahl an temporären Objekten müsste doch verhältnismäßig konstant bleiben, oder?
 
mihe7

mihe7

Top Contributor
Da scheint irgendwo ein Fehler zu sein, die Meldung ist keineswegs "normal". Kannst Du den Code online stellen?
 
M

maGG

Bekanntes Mitglied
Hab meine Methoden zum Editieren der Datenbank, in Anlehnung an deinen Vorschlag, jetzt so ausgelagert:

Java:
public class DatabaseRepository {
   
    public enum View{
        DOMESTIC, FOREIGN, COMPANY, TITEL, ROLE
    }
   
    public enum Update{
        DOMESTIC, FOREIGN, COMPANY , TITEL, ROLE
    }
   
    public enum Insert{
        DOMESTIC, FOREIGN, COMPANY , TITEL, ROLE
    }
   
    public enum Delete{
        DOMESTIC, FOREIGN, COMPANY , TITEL, ROLE
    }
   
    private static final EnumMap<View, String> queryView = new EnumMap<>(View.class);
   
    private static final EnumMap<Update, String> queryUpdate = new EnumMap<>(Update.class);
   
    private static final EnumMap<Insert, String> queryInsert = new EnumMap<>(Insert.class);
   
    private static final EnumMap<Delete, String> queryDelete = new EnumMap<>(Delete.class);
   
    static{
        queryView.put(View.DOMESTIC, "SELECT * FROM Filialen_Deutschland");
        queryView.put(View.FOREIGN, "SELECT * FROM Filialen_Ausland");
        queryView.put(View.COMPANY, "SELECT * FROM Filialen_Ausland");
        queryView.put(View.TITEL, "SELECT * FROM Filialen_Ausland");
        queryView.put(View.ROLE, "SELECT * FROM Filialen_Ausland");
       
        queryUpdate.put(Update.DOMESTIC, "UPDATE Filialen_Deutschland SET id=?, LABEL=?, STRASZE=?, PLZ_ORT=?, ORT=?,TEL_LAND=?, " +
                "TEL_ANFANG_INT=?, TEL_ANFANG_TXT=?, TEL_ENDE_DEFAULT=?, FAX_ANFANG_TXT=?, FAX_ENDE_TXT=? WHERE id=?");      
        queryUpdate.put(Update.FOREIGN, "UPDATE Filialen_Ausland SET id=?, LABEL=?, STRASZE=?, PLZ_ORT=?, ORT=?,TEL_LAND=?, " +
                "TEL_ANFANG_INT=?, TEL_ANFANG_TXT=?, TEL_ENDE_DEFAULT=?, FAX_ANFANG_TXT=?, FAX_ENDE_TXT=? WHERE id=?");
        queryUpdate.put(Update.COMPANY, "UPDATE Firmierungen SET id=?, LABEL=? WHERE id=?");
        queryUpdate.put(Update.TITEL, "UPDATE Titel SET id=?, LABEL=?, VORNE=? WHERE id=?");      
        queryUpdate.put(Update.ROLE, "UPDATE Funktionen SET id=?, LABEL=? WHERE id=?");
       
        queryInsert.put(Insert.DOMESTIC, "INSERT INTO Filialen_Deutschland (id,LABEL,STRASZE,PLZ_ORT,ORT,TEL_LAND,TEL_ANFANG_INT," +
                "TEL_ANFANG_TXT,TEL_ENDE_DEFAULT,FAX_ANFANG_TXT,FAX_ENDE_TXT) VALUES(?,?,?,?,?,?,?,?,?,?,?)");
        queryInsert.put(Insert.FOREIGN, "INSERT INTO Filialen_Ausland (id,LABEL,STRASZE,PLZ_ORT,ORT,TEL_LAND,TEL_ANFANG_INT," +
                "TEL_ANFANG_TXT,TEL_ENDE_DEFAULT,FAX_ANFANG_TXT,FAX_ENDE_TXT) VALUES(?,?,?,?,?,?,?,?,?,?,?)");
        queryInsert.put(Insert.COMPANY, "INSERT INTO Firmierungen (id,LABEL) VALUES(?,?)");
        queryInsert.put(Insert.TITEL, "INSERT INTO Titel (id,LABEL,VORNE) VALUES(?,?,?)");
        queryInsert.put(Insert.ROLE, "INSERT INTO Funktionen (id,LABEL) VALUES(?,?)");
       
        queryDelete.put(Delete.DOMESTIC, "DELETE FROM Filialen_Deutschland WHERE id=?");
        queryDelete.put(Delete.FOREIGN, "DELETE FROM Filialen_Ausland WHERE id=?");
        queryDelete.put(Delete.COMPANY, "DELETE FROM Firmierungen WHERE id=?");
        queryDelete.put(Delete.TITEL, "DELETE FROM Titel WHERE id=?");
        queryDelete.put(Delete.ROLE, "DELETE FROM Funktionen WHERE id=?");
    }
   
    private Connection conn;
   
    public DatabaseRepository (Connection conn){
        this.conn = conn;      
    }    

    public void viewTable(View view, JTable table) throws SQLException{
        String sql = queryView.get(view);
        try (PreparedStatement pst = conn.prepareStatement(sql)) {
            try (ResultSet rs = pst.executeQuery()) {
                table.setModel(DbUtils.resultSetToTableModel(rs));
            }
        }  
    }  
   
    public void updateTable(Update update, JTextField textField, String f2, String f3, String f4, String f5, int f6, long f7, String f8,
            String f9, String f10, String f11) throws SQLException{
        String sql = queryUpdate.get(update);
        int id = Integer.parseInt(textField.getText());
        try (PreparedStatement pst = conn.prepareStatement(sql)) {
                pst.setInt(1, id); // id
                pst.setString(2, f2); //LABEL
                pst.setString(3, f3); //STRASZE
                pst.setString(4, f4); //PLZ_ORT
                pst.setString(5, f5); //ORT
                pst.setInt(6, f6); //TEL_LAND
                pst.setLong(7, f7); //TEL_ANFANG_INT
                pst.setString(8, f8); //TEL_ANFANG_TXT
                if (f9.equals("")) {
                    pst.setObject(9, null);
                } else {
                    pst.setInt(9, Integer.parseInt(f9)); //TEL_ENDE_DEFAULT
                }
                pst.setString(10, f10); //FAX_ANFANG_TXT
                if (f11.equals("")) {
                    pst.setObject(11, null);
                } else {
                    pst.setString(11, f11); //FAX_ENDE_TXT
                }
                pst.setInt(12, id); //id (doppelt)
                pst.executeUpdate();
        }  
    }  
   
    public void updateTable(Update update, JTextField textField, String label) throws SQLException{
        String sql = queryUpdate.get(update);
        int id = Integer.parseInt(textField.getText());
        try (PreparedStatement pst = conn.prepareStatement(sql)) {
            pst.setInt(1, id);
            pst.setString(2, label);
            pst.setInt(3, id);
            pst.executeUpdate();
        }  
    }  
   
    public void updateTableTitels(Update update, JTextField textField, String label, boolean infront) throws SQLException{
        String sql = queryUpdate.get(update);
        int id = Integer.parseInt(textField.getText());
        try (PreparedStatement pst = conn.prepareStatement(sql)) {
            pst.setInt(1, id);
            pst.setString(2, label);
            pst.setBoolean(3, infront);
            pst.setInt(4, id);
            pst.executeUpdate();
        }  
    }  
   
    public void insertTable(Insert insert, JTextField textField, String f2, String f3, String f4, String f5, int f6, long f7, String f8,
            String f9, String f10, String f11) throws SQLException{
        String sql = queryInsert.get(insert);
        int id = Integer.parseInt(textField.getText());
        try (PreparedStatement pst = conn.prepareStatement(sql)) {
            pst.setInt(1, id); //id
            pst.setString(2, f2); //LABEL
            pst.setString(3, f3); //STRASZE
            pst.setString(4, f4); //PLZ_ORT
            pst.setString(5, f5); //ORT
            pst.setInt(6, f6); //TEL_LAND
            pst.setLong(7, f7); //TEL_ANFANG_INT
            pst.setString(8, f8); //TEL_ANFANG_TXT
            if (f9.equals("")) {
                pst.setObject(9, null);
            } else {
                pst.setInt(9, Integer.parseInt(f9)); //TEL_ENDE_DEFAULT
            }
            pst.setString(10, f10); //FAX_ANFANG_TXT
            if (f11.equals("")) {
                pst.setObject(11, null);
            } else {
                pst.setString(11, f11); //FAX_ENDE_TXT
            }
            pst.execute();
        }  
    }  
   
    public void insertTable(Insert insert, JTextField textField, String label) throws SQLException{
        String sql = queryInsert.get(insert);
        int id = Integer.parseInt(textField.getText());
        try (PreparedStatement pst = conn.prepareStatement(sql)) {
            pst.setInt(1, id);
            pst.setString(2, label);
            pst.execute();
        }  
    }
   
    public void insertTable(Insert insert, JTextField textField, String label, boolean infront) throws SQLException{
        String sql = queryInsert.get(insert);
        int id = Integer.parseInt(textField.getText());
        try (PreparedStatement pst = conn.prepareStatement(sql)) {
            pst.setInt(1, id);
            pst.setString(2, label);
            pst.setBoolean(3, infront);
            pst.execute();
        }  
    }  
   
    public void deleteTable(Delete delete, JTable table) throws SQLException{
        String sql = queryDelete.get(delete);
        int row = table.getSelectedRow();
        String tableClick = (table.getModel().getValueAt(row, 0).toString());        
        try (PreparedStatement pst = conn.prepareStatement(sql)) {
            pst.setString(1, tableClick);
            pst.execute();
        }
    }  
   
}
Cool oder? kann man das so machen? :)
 
Zuletzt bearbeitet:
mihe7

mihe7

Top Contributor
Cool oder? kann man das so machen?
Können tut man schon aber das erstens macht das Ding zu viel, zweitens orientiert es sich nicht an Business Entities, drittens geht es schöner und viertens haben UI-Klassen (wie JTable) dort nichts verloren.

Zum Thema UI-Klassen: stell Dir vor, nächsten Monat fällt die Entscheidung: oh, Swing ist Mist, wir machen jetzt JavaFX. Dann musst Du hier überall rumändern. Die Klasse muss so gestrickt sein, dass sie mit jedem x-beliebigen Client funktioniert.

Du versuchst, zu viel in eine Klasse zu stopfen. Vielleicht mal zum Unterschied: das BranchRepository verwaltet Filialen (Branch) und nur Filialen - keine Firmierungen, keine Companies, keine Funktionen. Das Location-enum gibt es dort nur, weil zwischen inländischen und ausländischen Filialen unterschieden wird. Somit dient die Location einfach als Query-Filter. Tatsächlich wäre die Location Teil des Domain Models und das enum müsste außerhalb der BranchRepository-Klasse definiert werden. Die EnumMap gibt es nur, weil zwei verschiedene Tabellen betroffen sind.

Es ist auf jeden Fall mal ein Schritt in die richtige Richtung und alles ist besser als sämtlichen Code in eine Klasse zu packen.
 
M

maGG

Bekanntes Mitglied
Hm ok, welcheBusiness Entities meinst du? Noch schöner? Hmm ich find das schon recht schön hehe, aber ja vielleicht ändert ich es noch.

Ich habe übrigens mehr Info zu den Fehlern:

Code:
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (malloc) failed to allocate 519536 bytes for Chunk::new
# Possible reasons:
#   The system is out of physical RAM or swap space
#   In 32 bit mode, the process size limit was hit
# Possible solutions:
#   Reduce memory load on the system
#   Increase physical memory or swap space
#   Check if swap backing store is full
#   Use 64 bit Java on a 64 bit OS
#   Decrease Java heap size (-Xmx/-Xms)
#   Decrease number of Java threads
#   Decrease Java thread stack sizes (-Xss)
#   Set larger code cache with -XX:ReservedCodeCacheSize=
# This output file may be truncated or incomplete.
#
#  Out of Memory Error (allocation.cpp:390), pid=8952, tid=0x000000000000227c
#
# JRE version: Java(TM) SE Runtime Environment (8.0_111-b14) (build 1.8.0_111-b14)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.111-b14 mixed mode windows-amd64 compressed oops)
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#

---------------  T H R E A D  ---------------

Current thread (0x0000000014949000):  JavaThread "C2 CompilerThread0" daemon [_thread_in_native, id=8828, stack(0x0000000015990000,0x0000000015a90000)]

Stack: [0x0000000015990000,0x0000000015a90000]
[error occurred during error reporting (printing stack bounds), id 0xc0000005]

Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)


Current CompileTask:
C2:  35042 3779       4       javax.swing.plaf.basic.BasicTextUI::installDefaults (463 bytes)


---------------  P R O C E S S  ---------------

Java Threads: ( => current thread )
  0x00000000166b8000 JavaThread "TimerQueue" daemon [_thread_blocked, id=5708, stack(0x0000000017d90000,0x0000000017e90000)]
  0x0000000002480800 JavaThread "DestroyJavaVM" [_thread_blocked, id=7644, stack(0x00000000022e0000,0x00000000023e0000)]
  0x0000000016613800 JavaThread "AWT-EventQueue-0" [_thread_in_Java, id=7428, stack(0x0000000017590000,0x0000000017690000)]
  0x0000000016594000 JavaThread "AWT-Windows" daemon [_thread_in_native, id=12684, stack(0x0000000016f90000,0x0000000017090000)]
  0x0000000016591000 JavaThread "AWT-Shutdown" [_thread_blocked, id=12012, stack(0x0000000016e90000,0x0000000016f90000)]
  0x0000000016590800 JavaThread "Java2D Disposer" daemon [_thread_blocked, id=13156, stack(0x0000000016d90000,0x0000000016e90000)]
  0x00000000149b1000 JavaThread "Service Thread" daemon [_thread_blocked, id=1980, stack(0x0000000015b90000,0x0000000015c90000)]
  0x00000000149a0800 JavaThread "C1 CompilerThread1" daemon [_thread_blocked, id=4068, stack(0x0000000015a90000,0x0000000015b90000)]
=>0x0000000014949000 JavaThread "C2 CompilerThread0" daemon [_thread_in_native, id=8828, stack(0x0000000015990000,0x0000000015a90000)]
  0x0000000014948000 JavaThread "Attach Listener" daemon [_thread_blocked, id=10088, stack(0x0000000015890000,0x0000000015990000)]
  0x0000000014944800 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=11688, stack(0x0000000015790000,0x0000000015890000)]
  0x0000000002576800 JavaThread "Finalizer" daemon [_thread_blocked, id=968, stack(0x0000000015580000,0x0000000015680000)]
  0x000000000256d000 JavaThread "Reference Handler" daemon [_thread_blocked, id=12420, stack(0x0000000015480000,0x0000000015580000)]

Other Threads:
  0x0000000014916800 VMThread [stack: 0x0000000015380000,0x0000000015480000] [id=11228]
  0x00000000149aa800 WatcherThread [stack: 0x0000000016090000,0x0000000016190000] [id=12716]

VM state:not at safepoint (normal execution)

VM Mutex/Monitor currently owned by a thread: None

Heap:
 PSYoungGen      total 76288K, used 27444K [0x00000000eb180000, 0x00000000f0e80000, 0x0000000100000000)
  eden space 63488K, 43% used [0x00000000eb180000,0x00000000ecc4d330,0x00000000eef80000)
  from space 12800K, 0% used [0x00000000efe00000,0x00000000efe00000,0x00000000f0a80000)
  to   space 14848K, 0% used [0x00000000eef80000,0x00000000eef80000,0x00000000efe00000)
 ParOldGen       total 88064K, used 78920K [0x00000000c1400000, 0x00000000c6a00000, 0x00000000eb180000)
  object space 88064K, 89% used [0x00000000c1400000,0x00000000c6112018,0x00000000c6a00000)
 Metaspace       used 17077K, capacity 17410K, committed 17792K, reserved 1064960K
  class space    used 1989K, capacity 2087K, committed 2176K, reserved 1048576K

Card table byte_map: [0x0000000011940000,0x0000000011b40000] byte_map_base: 0x0000000011336000

Marking Bits: (ParMarkBitMap*) 0x0000000059faa6c0
 Begin Bits: [0x0000000011e90000, 0x0000000012e40000)
 End Bits:   [0x0000000012e40000, 0x0000000013df0000)

Polling page: 0x0000000000890000

CodeCache: size=245760Kb used=12565Kb max_used=12578Kb free=233194Kb
 bounds [0x0000000002580000, 0x00000000031e0000, 0x0000000011580000]
 total_blobs=3999 nmethods=3474 adapters=436
 compilation: enabled

Compilation events (10 events):
Event: 34.652 Thread 0x0000000014949000 nmethod 3774 0x00000000031b9010 code [0x00000000031b9160, 0x00000000031b9378]
Event: 34.652 Thread 0x0000000014949000 3775  s    4       java.awt.MediaTracker::statusID (48 bytes)
Event: 34.753 Thread 0x0000000014949000 nmethod 3775 0x00000000031d4050 code [0x00000000031d42c0, 0x00000000031d7430]
Event: 34.754 Thread 0x0000000014949000 3776  s    4       java.awt.ImageMediaEntry::getStatus (80 bytes)
Event: 34.784 Thread 0x0000000014949000 nmethod 3776 0x00000000031c9dd0 code [0x00000000031c9fc0, 0x00000000031cb3d8]
Event: 34.784 Thread 0x0000000014949000 3777       4       javax.swing.plaf.basic.BasicHTML::getBaseline (43 bytes)
Event: 34.790 Thread 0x0000000014949000 nmethod 3777 0x00000000031ba390 code [0x00000000031ba4e0, 0x00000000031ba868]
Event: 34.790 Thread 0x0000000014949000 3778       4       java.awt.Rectangle::intersection (180 bytes)
Event: 34.794 Thread 0x0000000014949000 nmethod 3778 0x00000000031b7b90 code [0x00000000031b7ce0, 0x00000000031b7ef8]
Event: 34.816 Thread 0x0000000014949000 3779       4       javax.swing.plaf.basic.BasicTextUI::installDefaults (463 bytes)

GC Heap History (10 events):
Event: 19.542 GC heap before
{Heap before GC invocations=6 (full 0):
 PSYoungGen      total 35328K, used 35328K [0x00000000eb180000, 0x00000000f0a80000, 0x0000000100000000)
  eden space 32768K, 100% used [0x00000000eb180000,0x00000000ed180000,0x00000000ed180000)
  from space 2560K, 100% used [0x00000000ed180000,0x00000000ed400000,0x00000000ed400000)
  to   space 12800K, 0% used [0x00000000efe00000,0x00000000efe00000,0x00000000f0a80000)
 ParOldGen       total 44032K, used 26295K [0x00000000c1400000, 0x00000000c3f00000, 0x00000000eb180000)
  object space 44032K, 59% used [0x00000000c1400000,0x00000000c2dadc90,0x00000000c3f00000)
 Metaspace       used 16766K, capacity 17090K, committed 17536K, reserved 1064960K
  class space    used 1989K, capacity 2087K, committed 2176K, reserved 1048576K
Event: 19.756 GC heap after
Heap after GC invocations=6 (full 0):
 PSYoungGen      total 76288K, used 12800K [0x00000000eb180000, 0x00000000f0e80000, 0x0000000100000000)
  eden space 63488K, 0% used [0x00000000eb180000,0x00000000eb180000,0x00000000eef80000)
  from space 12800K, 100% used [0x00000000efe00000,0x00000000f0a80000,0x00000000f0a80000)
  to   space 14848K, 0% used [0x00000000eef80000,0x00000000eef80000,0x00000000efe00000)
 ParOldGen       total 44032K, used 26303K [0x00000000c1400000, 0x00000000c3f00000, 0x00000000eb180000)
  object space 44032K, 59% used [0x00000000c1400000,0x00000000c2dafc90,0x00000000c3f00000)
 Metaspace       used 16766K, capacity 17090K, committed 17536K, reserved 1064960K
  class space    used 1989K, capacity 2087K, committed 2176K, reserved 1048576K
}
Event: 25.067 GC heap before
{Heap before GC invocations=7 (full 0):
 PSYoungGen      total 76288K, used 76288K [0x00000000eb180000, 0x00000000f0e80000, 0x0000000100000000)
  eden space 63488K, 100% used [0x00000000eb180000,0x00000000eef80000,0x00000000eef80000)
  from space 12800K, 100% used [0x00000000efe00000,0x00000000f0a80000,0x00000000f0a80000)
  to   space 14848K, 0% used [0x00000000eef80000,0x00000000eef80000,0x00000000efe00000)
 ParOldGen       total 44032K, used 26303K [0x00000000c1400000, 0x00000000c3f00000, 0x00000000eb180000)
  object space 44032K, 59% used [0x00000000c1400000,0x00000000c2dafc90,0x00000000c3f00000)
 Metaspace       used 16910K, capacity 17218K, committed 17536K, reserved 1064960K
  class space    used 1989K, capacity 2087K, committed 2176K, reserved 1048576K
Event: 25.357 GC heap after
Heap after GC invocations=7 (full 0):
 PSYoungGen      total 78336K, used 14848K [0x00000000eb180000, 0x00000000f0e80000, 0x0000000100000000)
  eden space 63488K, 0% used [0x00000000eb180000,0x00000000eb180000,0x00000000eef80000)
  from space 14848K, 100% used [0x00000000eef80000,0x00000000efe00000,0x00000000efe00000)
  to   space 12800K, 0% used [0x00000000efe00000,0x00000000efe00000,0x00000000f0a80000)
 ParOldGen       total 45056K, used 44787K [0x00000000c1400000, 0x00000000c4000000, 0x00000000eb180000)
  object space 45056K, 99% used [0x00000000c1400000,0x00000000c3fbce70,0x00000000c4000000)
 Metaspace       used 16910K, capacity 17218K, committed 17536K, reserved 1064960K
  class space    used 1989K, capacity 2087K, committed 2176K, reserved 1048576K
}
Event: 25.357 GC heap before
{Heap before GC invocations=8 (full 1):
 PSYoungGen      total 78336K, used 14848K [0x00000000eb180000, 0x00000000f0e80000, 0x0000000100000000)
  eden space 63488K, 0% used [0x00000000eb180000,0x00000000eb180000,0x00000000eef80000)
  from space 14848K, 100% used [0x00000000eef80000,0x00000000efe00000,0x00000000efe00000)
  to   space 12800K, 0% used [0x00000000efe00000,0x00000000efe00000,0x00000000f0a80000)
 ParOldGen       total 45056K, used 44787K [0x00000000c1400000, 0x00000000c4000000, 0x00000000eb180000)
  object space 45056K, 99% used [0x00000000c1400000,0x00000000c3fbce70,0x00000000c4000000)
 Metaspace       used 16910K, capacity 17218K, committed 17536K, reserved 1064960K
  class space    used 1989K, capacity 2087K, committed 2176K, reserved 1048576K
Event: 27.327 GC heap after
Heap after GC invocations=8 (full 1):
 PSYoungGen      total 78336K, used 14293K [0x00000000eb180000, 0x00000000f0e80000, 0x0000000100000000)
  eden space 63488K, 0% used [0x00000000eb180000,0x00000000eb180000,0x00000000eef80000)
  from space 14848K, 96% used [0x00000000eef80000,0x00000000efd75590,0x00000000efe00000)
  to   space 12800K, 0% used [0x00000000efe00000,0x00000000efe00000,0x00000000f0a80000)
 ParOldGen       total 88064K, used 44642K [0x00000000c1400000, 0x00000000c6a00000, 0x00000000eb180000)
  object space 88064K, 50% used [0x00000000c1400000,0x00000000c3f98bf0,0x00000000c6a00000)
 Metaspace       used 16910K, capacity 17218K, committed 17536K, reserved 1064960K
  class space    used 1989K, capacity 2087K, committed 2176K, reserved 1048576K
}
Event: 31.783 GC heap before
{Heap before GC invocations=9 (full 1):
 PSYoungGen      total 78336K, used 77781K [0x00000000eb180000, 0x00000000f0e80000, 0x0000000100000000)
  eden space 63488K, 100% used [0x00000000eb180000,0x00000000eef80000,0x00000000eef80000)
  from space 14848K, 96% used [0x00000000eef80000,0x00000000efd75590,0x00000000efe00000)
  to   space 12800K, 0% used [0x00000000efe00000,0x00000000efe00000,0x00000000f0a80000)
 ParOldGen       total 88064K, used 44642K [0x00000000c1400000, 0x00000000c6a00000, 0x00000000eb180000)
  object space 88064K, 50% used [0x00000000c1400000,0x00000000c3f98bf0,0x00000000c6a00000)
 Metaspace       used 16990K, capacity 17346K, committed 17792K, reserved 1064960K
  class space    used 1989K, capacity 2087K, committed 2176K, reserved 1048576K
Event: 31.956 GC heap after
Heap after GC invocations=9 (full 1):
 PSYoungGen      total 76288K, used 12800K [0x00000000eb180000, 0x00000000f0e80000, 0x0000000100000000)
  eden space 63488K, 0% used [0x00000000eb180000,0x00000000eb180000,0x00000000eef80000)
  from space 12800K, 100% used [0x00000000efe00000,0x00000000f0a80000,0x00000000f0a80000)
  to   space 14848K, 0% used [0x00000000eef80000,0x00000000eef80000,0x00000000efe00000)
 ParOldGen       total 88064K, used 66819K [0x00000000c1400000, 0x00000000c6a00000, 0x00000000eb180000)
  object space 88064K, 75% used [0x00000000c1400000,0x00000000c5540e40,0x00000000c6a00000)
 Metaspace       used 16990K, capacity 17346K, committed 17792K, reserved 1064960K
  class space    used 1989K, capacity 2087K, committed 2176K, reserved 1048576K
}
Event: 31.956 GC heap before
{Heap before GC invocations=10 (full 2):
 PSYoungGen      total 76288K, used 12800K [0x00000000eb180000, 0x00000000f0e80000, 0x0000000100000000)
  eden space 63488K, 0% used [0x00000000eb180000,0x00000000eb180000,0x00000000eef80000)
  from space 12800K, 100% used [0x00000000efe00000,0x00000000f0a80000,0x00000000f0a80000)
  to   space 14848K, 0% used [0x00000000eef80000,0x00000000eef80000,0x00000000efe00000)
 ParOldGen       total 88064K, used 66819K [0x00000000c1400000, 0x00000000c6a00000, 0x00000000eb180000)
  object space 88064K, 75% used [0x00000000c1400000,0x00000000c5540e40,0x00000000c6a00000)
 Metaspace       used 16990K, capacity 17346K, committed 17792K, reserved 1064960K
  class space    used 1989K, capacity 2087K, committed 2176K, reserved 1048576K
Event: 32.955 GC heap after
Heap after GC invocations=10 (full 2):
 PSYoungGen      total 76288K, used 0K [0x00000000eb180000, 0x00000000f0e80000, 0x0000000100000000)
  eden space 63488K, 0% used [0x00000000eb180000,0x00000000eb180000,0x00000000eef80000)
  from space 12800K, 0% used [0x00000000efe00000,0x00000000efe00000,0x00000000f0a80000)
  to   space 14848K, 0% used [0x00000000eef80000,0x00000000eef80000,0x00000000efe00000)
 ParOldGen       total 88064K, used 78920K [0x00000000c1400000, 0x00000000c6a00000, 0x00000000eb180000)
  object space 88064K, 89% used [0x00000000c1400000,0x00000000c6112018,0x00000000c6a00000)
 Metaspace       used 16990K, capacity 17346K, committed 17792K, reserved 1064960K
  class space    used 1989K, capacity 2087K, committed 2176K, reserved 1048576K
}

Deoptimization events (10 events):
Event: 4.282 Thread 0x0000000016613800 Uncommon trap: reason=class_check action=maybe_recompile pc=0x00000000028490a4 method=java.util.HashMap.putVal(ILjava/lang/Object;Ljava/lang/Object;ZZ)Ljava/lang/Object; @ 253
Event: 4.282 Thread 0x0000000016613800 Uncommon trap: reason=class_check action=maybe_recompile pc=0x00000000028490a4 method=java.util.HashMap.putVal(ILjava/lang/Object;Ljava/lang/Object;ZZ)Ljava/lang/Object; @ 253
Event: 4.282 Thread 0x0000000016613800 Uncommon trap: reason=class_check action=maybe_recompile pc=0x0000000002812f44 method=java.util.HashMap.putVal(ILjava/lang/Object;Ljava/lang/Object;ZZ)Ljava/lang/Object; @ 253
Event: 4.634 Thread 0x0000000016613800 Uncommon trap: reason=unstable_if action=reinterpret pc=0x000000000286eb1c method=sun.nio.cs.UTF_8$Encoder.encode([CII[B)I @ 33
Event: 5.211 Thread 0x0000000016613800 Uncommon trap: reason=unstable_if action=reinterpret pc=0x0000000002955904 method=org.sqlite.SQLiteJDBCLoader.contentsEquals(Ljava/io/InputStream;Ljava/io/InputStream;)Z @ 39
Event: 5.679 Thread 0x0000000016613800 Uncommon trap: reason=unstable_if action=reinterpret pc=0x000000000282ece4 method=java.lang.ref.SoftReference.get()Ljava/lang/Object; @ 17
Event: 28.776 Thread 0x0000000016613800 Uncommon trap: reason=array_check action=maybe_recompile pc=0x000000000278b088 method=java.awt.AWTEventMulticaster.populateListenerArray([Ljava/util/EventListener;Ljava/util/EventListener;I)I @ 51
Event: 28.776 Thread 0x0000000016613800 Uncommon trap: reason=array_check action=maybe_recompile pc=0x000000000278b088 method=java.awt.AWTEventMulticaster.populateListenerArray([Ljava/util/EventListener;Ljava/util/EventListener;I)I @ 51
Event: 28.776 Thread 0x0000000016613800 Uncommon trap: reason=array_check action=maybe_recompile pc=0x000000000278b088 method=java.awt.AWTEventMulticaster.populateListenerArray([Ljava/util/EventListener;Ljava/util/EventListener;I)I @ 51
Event: 28.777 Thread 0x0000000016613800 Uncommon trap: reason=array_check action=maybe_recompile pc=0x000000000278b088 method=java.awt.AWTEventMulticaster.populateListenerArray([Ljava/util/EventListener;Ljava/util/EventListener;I)I @ 51

Internal exceptions (10 events):
Event: 0.566 Thread 0x0000000002480800 Exception <a 'java/security/PrivilegedActionException'> (0x00000000eb37c000) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u111\7883\hotspot\src\share\vm\prims\jvm.cpp, line 1386]
Event: 0.566 Thread 0x0000000002480800 Exception <a 'java/security/PrivilegedActionException'> (0x00000000eb37c210) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u111\7883\hotspot\src\share\vm\prims\jvm.cpp, line 1386]
Event: 0.570 Thread 0x0000000002480800 Exception <a 'java/security/PrivilegedActionException'> (0x00000000eb3800f8) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u111\7883\hotspot\src\share\vm\prims\jvm.cpp, line 1386]
Event: 0.570 Thread 0x0000000002480800 Exception <a 'java/security/PrivilegedActionException'> (0x00000000eb380308) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u111\7883\hotspot\src\share\vm\prims\jvm.cpp, line 1386]
Event: 0.585 Thread 0x0000000002480800 Exception <a 'java/io/FileNotFoundException'> (0x00000000eb382f48) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u111\7883\hotspot\src\share\vm\prims\jni.cpp, line 709]
Event: 0.759 Thread 0x0000000002480800 Exception <a 'java/lang/NoSuchFieldError': method resolution failed> (0x00000000eb450730) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u111\7883\hotspot\src\share\vm\prims\methodHandles.cpp, line 1146]
Event: 0.781 Thread 0x0000000002480800 Exception <a 'java/lang/NoSuchFieldError': method resolution failed> (0x00000000eb45da80) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u111\7883\hotspot\src\share\vm\prims\methodHandles.cpp, line 1146]
Event: 1.083 Thread 0x0000000002480800 Exception <a 'java/io/FileNotFoundException'> (0x00000000eb591ee0) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u111\7883\hotspot\src\share\vm\prims\jni.cpp, line 709]
Event: 3.302 Thread 0x0000000016613800 Exception <a 'java/io/FileNotFoundException'> (0x00000000ebc493c0) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u111\7883\hotspot\src\share\vm\prims\jni.cpp, line 709]
Event: 3.398 Thread 0x0000000016613800 Exception <a 'java/io/FileNotFoundException'> (0x00000000ebc8fb78) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u111\7883\hotspot\src\share\vm\prims\jni.cpp, line 709]

Events (10 events):
Event: 28.776 Thread 0x0000000016613800 Uncommon trap: trap_request=0xffffffd6 fr.pc=0x000000000278b088
Event: 28.776 Thread 0x0000000016613800 DEOPT PACKING pc=0x000000000278b088 sp=0x00000000176880c0
Event: 28.776 Thread 0x0000000016613800 DEOPT UNPACKING pc=0x00000000025c582a sp=0x0000000017688040 mode 2
Event: 28.777 Thread 0x0000000016613800 Uncommon trap: trap_request=0xffffffd6 fr.pc=0x000000000278b088
Event: 28.777 Thread 0x0000000016613800 DEOPT PACKING pc=0x000000000278b088 sp=0x0000000017687c50
Event: 28.777 Thread 0x0000000016613800 DEOPT UNPACKING pc=0x00000000025c582a sp=0x0000000017687bd0 mode 2
Event: 31.783 Executing VM operation: ParallelGCFailedAllocation
Event: 32.955 Executing VM operation: ParallelGCFailedAllocation done
Event: 32.956 Executing VM operation: RevokeBias
Event: 32.958 Executing VM operation: RevokeBias done


Dynamic libraries:
0x00007ff61a100000 - 0x00007ff61a137000     C:\Program Files\Java\jdk1.8.0_111\jre\bin\java.exe
0x00007ffdc68f0000 - 0x00007ffdc6ac2000     C:\WINDOWS\SYSTEM32\ntdll.dll
0x00007ffdc4510000 - 0x00007ffdc45bc000     C:\WINDOWS\System32\KERNEL32.DLL
0x00007ffdc31e0000 - 0x00007ffdc33fd000     C:\WINDOWS\System32\KERNELBASE.dll
0x00007ffdc46c0000 - 0x00007ffdc4762000     C:\WINDOWS\System32\ADVAPI32.dll
0x00007ffdc4770000 - 0x00007ffdc480e000     C:\WINDOWS\System32\msvcrt.dll
0x00007ffdc3f60000 - 0x00007ffdc3fb9000     C:\WINDOWS\System32\sechost.dll
0x00007ffdc4060000 - 0x00007ffdc4181000     C:\WINDOWS\System32\RPCRT4.dll
0x00007ffdc4880000 - 0x00007ffdc49e5000     C:\WINDOWS\System32\USER32.dll
0x00007ffdc2ff0000 - 0x00007ffdc300e000     C:\WINDOWS\System32\win32u.dll
0x00007ffdc4ab0000 - 0x00007ffdc4ae4000     C:\WINDOWS\System32\GDI32.dll
0x00007ffdc3570000 - 0x00007ffdc36f0000     C:\WINDOWS\System32\gdi32full.dll
0x00007ffdb61e0000 - 0x00007ffdb645a000     C:\WINDOWS\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.14393.953_none_42151e83c686086b\COMCTL32.dll
0x00007ffdc4af0000 - 0x00007ffdc4db8000     C:\WINDOWS\System32\combase.dll
0x00007ffdc2ef0000 - 0x00007ffdc2fe5000     C:\WINDOWS\System32\ucrtbase.dll
0x00007ffdc34b0000 - 0x00007ffdc351a000     C:\WINDOWS\System32\bcryptPrimitives.dll
0x00007ffdc6480000 - 0x00007ffdc64ae000     C:\WINDOWS\System32\IMM32.DLL
0x000000005b140000 - 0x000000005b212000     C:\Program Files\Java\jdk1.8.0_111\jre\bin\msvcr100.dll
0x0000000059790000 - 0x000000005a02a000     C:\Program Files\Java\jdk1.8.0_111\jre\bin\server\jvm.dll
0x00007ffdc64b0000 - 0x00007ffdc64b8000     C:\WINDOWS\System32\PSAPI.DLL
0x00007ffdc00d0000 - 0x00007ffdc00d9000     C:\WINDOWS\SYSTEM32\WSOCK32.dll
0x00007ffdc4810000 - 0x00007ffdc487a000     C:\WINDOWS\System32\WS2_32.dll
0x00007ffdc11e0000 - 0x00007ffdc1203000     C:\WINDOWS\SYSTEM32\WINMM.dll
0x00007ffdb6560000 - 0x00007ffdb656a000     C:\WINDOWS\SYSTEM32\VERSION.dll
0x00007ffdc0f40000 - 0x00007ffdc0f6b000     C:\WINDOWS\SYSTEM32\WINMMBASE.dll
0x00007ffdc3520000 - 0x00007ffdc3562000     C:\WINDOWS\System32\cfgmgr32.dll
0x000000005b130000 - 0x000000005b13f000     C:\Program Files\Java\jdk1.8.0_111\jre\bin\verify.dll
0x000000005b100000 - 0x000000005b129000     C:\Program Files\Java\jdk1.8.0_111\jre\bin\java.dll
0x000000005b0e0000 - 0x000000005b0f6000     C:\Program Files\Java\jdk1.8.0_111\jre\bin\zip.dll
0x00007ffdc4f70000 - 0x00007ffdc6479000     C:\WINDOWS\System32\SHELL32.dll
0x00007ffdc36f0000 - 0x00007ffdc3dc9000     C:\WINDOWS\System32\windows.storage.dll
0x00007ffdc2da0000 - 0x00007ffdc2dec000     C:\WINDOWS\System32\powrprof.dll
0x00007ffdc42f0000 - 0x00007ffdc4342000     C:\WINDOWS\System32\shlwapi.dll
0x00007ffdc2d60000 - 0x00007ffdc2d6f000     C:\WINDOWS\System32\kernel.appcore.dll
0x00007ffdc3dd0000 - 0x00007ffdc3e79000     C:\WINDOWS\System32\shcore.dll
0x00007ffdc2d70000 - 0x00007ffdc2d84000     C:\WINDOWS\System32\profapi.dll
0x00000000595f0000 - 0x0000000059788000     C:\Program Files\Java\jdk1.8.0_111\jre\bin\awt.dll
0x00007ffdc49f0000 - 0x00007ffdc4aaf000     C:\WINDOWS\System32\OLEAUT32.dll
0x00007ffdc2df0000 - 0x00007ffdc2e8c000     C:\WINDOWS\System32\msvcp_win.dll
0x00007ffdc13e0000 - 0x00007ffdc145a000     C:\WINDOWS\SYSTEM32\apphelp.dll
0x00007ffdc1580000 - 0x00007ffdc1615000     C:\WINDOWS\system32\uxtheme.dll
0x00007ffdc4190000 - 0x00007ffdc42ea000     C:\WINDOWS\System32\MSCTF.dll
0x00007ffdc0c90000 - 0x00007ffdc0cb6000     C:\WINDOWS\system32\dwmapi.dll
0x00007ffdc4e30000 - 0x00007ffdc4f68000     C:\WINDOWS\System32\ole32.dll
0x000000005b050000 - 0x000000005b097000     C:\Program Files\Java\jdk1.8.0_111\jre\bin\fontmanager.dll
0x000000005b0c0000 - 0x000000005b0da000     C:\Program Files\Java\jdk1.8.0_111\jre\bin\net.dll
0x00007ffdc2630000 - 0x00007ffdc268c000     C:\WINDOWS\system32\mswsock.dll
0x000000005b0a0000 - 0x000000005b0b1000     C:\Program Files\Java\jdk1.8.0_111\jre\bin\nio.dll
0x000000005b000000 - 0x000000005b042000     C:\Program Files\Java\jdk1.8.0_111\jre\bin\t2k.dll
0x00007ffdc3fc0000 - 0x00007ffdc405f000     C:\WINDOWS\System32\clbcatq.dll
0x00007ffdc03c0000 - 0x00007ffdc0568000     C:\WINDOWS\SYSTEM32\WindowsCodecs.dll
0x00007ffda4440000 - 0x00007ffda4489000     C:\WINDOWS\system32\dataexchange.dll
0x00007ffdc0de0000 - 0x00007ffdc0f31000     C:\WINDOWS\system32\dcomp.dll
0x00007ffdbf100000 - 0x00007ffdbf3b6000     C:\WINDOWS\system32\d3d11.dll
0x00007ffdc1e00000 - 0x00007ffdc1e9f000     C:\WINDOWS\system32\dxgi.dll
0x00007ffdc1890000 - 0x00007ffdc19ac000     C:\WINDOWS\system32\twinapi.appcore.dll
0x00007ffdc2ca0000 - 0x00007ffdc2ccb000     C:\WINDOWS\system32\bcrypt.dll
0x00007ffdc27d0000 - 0x00007ffdc27e7000     C:\WINDOWS\SYSTEM32\CRYPTSP.dll
0x00007ffdc2230000 - 0x00007ffdc2263000     C:\WINDOWS\system32\rsaenh.dll
0x00007ffdc24b0000 - 0x00007ffdc24cf000     C:\WINDOWS\SYSTEM32\USERENV.dll
0x00007ffdc2c90000 - 0x00007ffdc2c9b000     C:\WINDOWS\SYSTEM32\CRYPTBASE.dll
0x00007ffdc23b0000 - 0x00007ffdc23e8000     C:\WINDOWS\SYSTEM32\IPHLPAPI.DLL
0x00007ffdc4dc0000 - 0x00007ffdc4dc8000     C:\WINDOWS\System32\NSI.dll
0x00007ffdb9840000 - 0x00007ffdb9856000     C:\WINDOWS\SYSTEM32\dhcpcsvc6.DLL
0x00007ffdb9800000 - 0x00007ffdb981a000     C:\WINDOWS\SYSTEM32\dhcpcsvc.DLL
0x000000006d080000 - 0x000000006d175000     C:\Users\david\AppData\Local\Temp\sqlite-3.21.0-6700884f-1794-4307-a7ca-45322a00aa97-sqlitejdbc.dll

VM Arguments:
jvm_args: -Dfile.encoding=UTF-8
java_command: signatur.GUI
java_class_path (initial): C:\Program Files\NetBeans 8.2\java\modules\ext\eclipselink\eclipselink.jar;C:\Program Files\NetBeans 8.2\java\modules\ext\eclipselink\javax.persistence_2.1.0.v201304241213.jar;C:\Program Files\NetBeans 8.2\java\modules\ext\eclipselink\org.eclipse.persistence.jpa.jpql_2.5.2.v20140319-9ad6abd.jar;C:\Program Files\NetBeans 8.2\java\modules\ext\AbsoluteLayout.jar;C:\Users\david\Documents\commons-io-2.4.jar;C:\Users\david\Documents\sqlite-jdbc-3.21.0.jar;C:\Users\david\Documents\rs2xml.jar;C:\Users\david\Downloads\sqlite-jdbc-3.21.0.jar;C:\Users\david\Downloads\rs2xml.jar;C:\Users\david\Downloads\commons-io-2.4.jar;C:\Users\david\Documents\velocity-engine-core-2.0.jar;C:\Users\david\Desktop\Signatur\build\classes
Launcher Type: SUN_STANDARD

Environment Variables:
PATH=C:\Program Files (x86)\Intel\TXE Components\TCS\;C:\Program Files\Intel\TXE Components\TCS\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\TXE Components\DAL\;C:\Program Files (x86)\Intel\TXE Components\DAL\;C:\Program Files\Intel\TXE Components\IPT\;C:\Program Files (x86)\Intel\TXE Components\IPT\;C:\Program Files\Common Files\Autodesk Shared\;C:\Program Files\nodejs\;C:\Users\david\AppData\Local\Microsoft\WindowsApps;C:\Users\david\AppData\Roaming\npm;C:\Users\david\AppData\Local\Programs\MiKTeX 2.9\miktex\bin\x64\
USERNAME=david
OS=Windows_NT
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 76 Stepping 4, GenuineIntel



---------------  S Y S T E M  ---------------

OS: Windows 10.0 , 64 bit Build 14393 (10.0.14393.2189)

CPU:total 2 (2 cores per cpu, 1 threads per core) family 6 model 76 stepping 4, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3, sse4.1, sse4.2, popcnt, aes, clmul, erms, 3dnowpref, tsc, tscinvbit

Memory: 4k page, physical 4104464k(345056k free), swap 9655920k(4884k free)

vm_info: Java HotSpot(TM) 64-Bit Server VM (25.111-b14) for windows-amd64 JRE (1.8.0_111-b14), built on Sep 22 2016 19:24:05 by "java_re" with MS VC++ 10.0 (VS2010)

time: Fri Apr 19 13:32:59 2019
elapsed time: 35 seconds (0d 0h 0m 35s)

Daraus werde ich jedoch auch nicht wirklich schlauer o_O
 
mihe7

mihe7

Top Contributor
Wie viele Daten lädst Du denn in die Anwendung?

Nachtrag: Du kannst mal versuchen, ob es läuft, wenn Du unter Project Properties -> Run -> VM Options "-Xms1024m -Xmx1024m" oder höhere Werte einträgst.
 
M

maGG

Bekanntes Mitglied
Hab beides ausprobiert. Funktioniert beides nicht. Die Daten, die in das Programm geladen werden beschtänken sich auf 5 Tabelle mit jeweils etwa 5-30 Zeileneinträgen ... das ist glaub kaum der Rede wert. Kann es nicht vielleicht sein, dass unendlich viele Objekte erzeugt werden an einer Stelle? Weil sobald ich den Instanzaufruf habe schmiert das Programm ab: "br = new BranchRepository;" sobald die Zeile auskomment ist im Konstruktor startet das Programm wieder. Vielleicht entsteht da eine Schleife aus der der Compiler nicht mehr rauskommt? Kann das sein?
 
mihe7

mihe7

Top Contributor
Die Daten, die in das Programm geladen werden beschtänken sich auf 5 Tabelle mit jeweils etwa 5-30 Zeileneinträgen ... das ist glaub kaum der Rede wert. Kann es nicht vielleicht sein, dass unendlich viele Objekte erzeugt werden an einer Stelle? Weil sobald ich den Instanzaufruf habe schmiert das Programm ab: "br = new BranchRepository;" sobald die Zeile auskomment ist im Konstruktor startet das Programm wieder. Vielleicht entsteht da eine Schleife aus der der Compiler nicht mehr rauskommt? Kann das sein?
Ja, das Problem ist, dass Du BranchRepository von GUI ableitest. Mach das "extends GUI" raus.

EDIT: mach das "extends GUI" bei allen Klassen raus. Das ist grundsätzlicher, grober Unfug.
 
Zuletzt bearbeitet:
M

maGG

Bekanntes Mitglied
Ahja das war tatsächlich das Problem :D Vielen Dank!! Druch das extends GUI wurde initComponents nochmal aufgerufen und dadurch ist so ne endlos Schleife entstanden, wo immer wieder der Instanzaufruf kahm und dann wieder initComponents, etc. XD

Du versuchst, zu viel in eine Klasse zu stopfen. Vielleicht mal zum Unterschied: das BranchRepository verwaltet Filialen (Branch) und nur Filialen - keine Firmierungen, keine Companies, keine Funktionen. Das Location-enum gibt es dort nur, weil zwischen inländischen und ausländischen Filialen unterschieden wird. Somit dient die Location einfach als Query-Filter. Tatsächlich wäre die Location Teil des Domain Models und das enum müsste außerhalb der BranchRepository-Klasse definiert werden. Die EnumMap gibt es nur, weil zwei verschiedene Tabellen betroffen sind.

Achso, du meinst, dass ich den enum-Teil und die static mit sql in die Hauptklasse lieber schieben sollte? Irgendwie muss ichs halt aufteilen. Ich könnte halt entweder Klassen pro Tabelle machen, oder Klasse für Funktionen (preview, update, insert, delete), oder nochmal anders hmm ist es besser die Klassen pro Tabelle einzuführen? Die GUI Elemente habe ich jetzt aus der Klasse wieder entfernt übrigens. Was meinst du eigentlich mit "Business Entities"?
 
mihe7

mihe7

Top Contributor
Mit Business Entity meine ich einfach Objekte der Geschäftslogik, die über konzeptionelle Identität verfügen. Das sind meist gerade die Dinge, für die Du auch eine Tabelle in der DB anlegst. Das sind solche Dinge, über die Du Dich mit Deinem Auftraggeber/Kunden bzw. mit den Anwendern unterhältst.

In Deinem Modell existiert beispielsweise die Filiale nur in der Datenbank. Im Programm taucht sie lediglich in Form von UI-Komponenten und DB-Abfragen auf. Du hast aber nirgends im Code eine Klasse, die eine Filiale darstellen würde.

Achso, du meinst, dass ich den enum-Teil und die static mit sql in die Hauptklasse lieber schieben sollte?
Nein, ich meine damit, dass die Location entweder als separate .java-Datei existiert oder in einer Klasse Branch definiert wird. Die EnumMaps hingegen existieren höchstens im BranchRepository, weil die Filialen aus unterschiedlichen Tabellen kommen, die anhand der Location unterschieden werden. EDIT: Für Firmierungen, Companies, Funktionen gäbe es ggf. eigene Repositories, daher braucht es dort auch keine Maps.

Bevor ich mehr dazu schreibe: gibt es eigentlich einen bestimmten Grund, warum die Filialen in zwei verschiedenen Tabellen gespeichert werden?
 
M

maGG

Bekanntes Mitglied
Bevor ich mehr dazu schreibe: gibt es eigentlich einen bestimmten Grund, warum die Filialen in zwei verschiedenen Tabellen gespeichert werden?
Ich empfand es als übersichtlicher es aufzuteilen, im Ausland haben wir teilweise ganz andere Firmierungen. Für den Nutzer am Ende ist es wohlmöglich übersichtlicher es getrennt zu haben; so weiß man hoffentlich, dass man im Ausland dann nicht "GmbH" oder "AG" auswählt, sondern "Ltd." oder "B.V.".
Hat er womöglich die DTOs (oder VO, POJO, JavaBean...) vergessen? :eek:
Ne, ich weiß nicht mal was das ist (werde ich später mal nachschauen)
In Deinem Modell existiert beispielsweise die Filiale nur in der Datenbank. Im Programm taucht sie lediglich in Form von UI-Komponenten und DB-Abfragen auf. Du hast aber nirgends im Code eine Klasse, die eine Filiale darstellen würde
Achso, du meinst dass ich dann z.B. noch die Klassen Filialen, Firmierung, Titel, etc. einführe, oder eine Klasse Person, die bestimmte Parameter in sich vereinigt. Welchen Vorteil hat man davon? Evtl. wenn man das Programm später noch erweitern möchte?
EDIT: Für Firmierungen, Companies, Funktionen gäbe es ggf. eigene Repositories, daher braucht es dort auch keine Maps.
Ok, also du meinst schon Repository Klassen für Tabellen sind sinnvoller als für gleichartige Methoden? (Update, Insert, Delete, etc.)
 
mihe7

mihe7

Top Contributor
Für den Nutzer am Ende ist es wohlmöglich übersichtlicher es getrennt zu haben; so weiß man hoffentlich, dass man im Ausland dann nicht "GmbH" oder "AG" auswählt, sondern "Ltd." oder "B.V.".
Was Du in der DB stehen hast und was der Benutzer sieht, sind zwei paar Stiefel :)

Achso, du meinst dass ich dann z.B. noch die Klassen Filialen, Firmierung, Titel, etc. einführe, oder eine Klasse Person, die bestimmte Parameter in sich vereinigt.
Richtig.

Welchen Vorteil hat man davon?
Naja, zum einen findet man die Konzepte des Problembereichs im Code wieder, zum anderen hat man klare Zuständigkeiten und definierte Code-Einheiten.

Wenn Du z. B. ein BranchRepository hast, das Branch-Objekte zurückgibt, dann brauchst Du nicht für jedes "Feld" eine Abfrage, sondern kannst die Liste für die Tabelle als auch für die ComboBox verwenden.

Wenn das Repository dann noch über Änderungen informiert (Events), dann lässt sich vieles einfacher automatisieren. Beispiel: der Anwender steht in dem Fenster, in dem er eine Person bearbeitet und die Zugehörigkeit zu einer Filiale über eine Combobox auswählt. Jetzt stellt er fest, dass eine Filiale fehlt. Daher öffnet er die Filialverwaltung und fügt dort eine Filiale hinzu.

Jetzt kann man z. B. folgendes machen: Das Repository führt den INSERT aus und informiert alle Beobachter darüber, dass (und ggf. welche) es eine neue Filiale gibt. Da man zuvor das Combobox-Model als Beobachter des Repositories registriert hat, wird es über diese Neuerung informiert und der Benutzer hat die neue Filiale sofort in der Auswahl stehen.

Man kann noch einen Schritt weitergehen und ComboBox und TableModel zusammenfassen, denn in beiden Fällen werden jetzt ja einfach Branch-Objekte verwaltet. Die JComboBox bekommt dann lediglich einen passenden Renderer, der nur den Namen zurückgibt.

Ok, also du meinst schon Repository Klassen für Tabellen sind sinnvoller als für gleichartige Methoden?
Ich betrachte das nicht aus Sicht der Datenbank, aber ja, kann man grob so sagen.
 
M

maGG

Bekanntes Mitglied
Ah ok, ich habe jetzt ein Ordner "ObjectClasses" und ein Ordner "RepositoryClasses". Ich bin mir aber nicht sicher, wie ich meine Klasse Branch benutzen kann. Für die FillComboBox Methode bringt das Objekt nichts glaub ich, weil nur das Label gebraucht wird. Und für Update und Insert hätte ich zwar alle notwendigen Übergabeparamenter, ich weiß aber nicht wie ich die einsetzen kann. Aktuell mache ich das ja mit "pst.setString(int, parameter)" oder pst.setInt(int, parameter). Die Getter und Setter Methoden habe ich auch alle in Branch.

Bisher sind das bei mir ja void Methoden, bei deinem Beispiel mit List<Branch> findAll() und List<Branch> findbyLocation(Location where) brauche ich irgendein return Wert, geht das damit? Also bisher werden die meine Parameter ja nur in einer abgewandelten toString Methode als Template in einem Writer geschrieben und das Programm gibt verschiede Textdateien aus. Also mir fehlen jetzt gerade die Anwendungsbeispiele, wo ich das benutzen könnte. Oder übersehe ich da was? Kann das in bisherigen Methoden benutzen?

Das mit der Eventmethode hört sich interessant an, dann könnte ich ein Panel erstellen, wo sowas angzeigt wird.
 
mihe7

mihe7

Top Contributor
Ordner? Du meinst Klassen, oder?

Für die FillComboBox Methode bringt das Objekt nichts glaub ich, weil nur das Label gebraucht wird.
Doch. Das Objekt bringt aus mehreren Gründen etwas: erstens wählst Du ein Branch-Objekt aus (d. h. Du bekommst das vollständige Objekt und nicht nur das Label zurück), zweitens brauchst Du die DB nicht extra bemühen. Du musst Dir allerdings einen Renderer schreiben.

Und für Update und Insert hätte ich zwar alle notwendigen Übergabeparamenter, ich weiß aber nicht wie ich die einsetzen kann. Aktuell mache ich das ja mit "pst.setString(int, parameter)" oder pst.setInt(int, parameter). Die Getter und Setter Methoden habe ich auch alle in Branch.
Das machst Du weiterhin genauso, nur dass die Daten aus dem Branch-Objekt kommen.

Bei Deinem zweiten Absatz verstehe ich nicht, worauf Du hinaus willst.
 
M

maGG

Bekanntes Mitglied
Ne ich meinte das so:

11733


wie meinst du das mit dem Branch Objekt? Du meinst einen Instanzaufruf/Konstruktoraufruf?

Und was meinst du mit Renderer?

:)
 
M

maGG

Bekanntes Mitglied
Meinst du sowas?
Java:
public class BranchComboBox extends BasicComboBoxRenderer{

    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean celHasFocus){
        Branch branch = (Branch) value;
        if(index == 0){
            setText("Bitte auswählen");
        }else{
            setText(branch.getLabel());
        }
        return this;      
    }
   
}

Meine Branch Class sieht so jetzt aus:
Java:
public class Branch {

    int id, vorwahl;
    long telStartNum;
    String label, strasze, plzort, ort, telStartTxt, telEndDefault, faxStartTxt, faxEndTxt;  
   
    public Branch(){
        this.id = 0;
        this.vorwahl = 0;
        this.telStartNum = 0;
        this.label = "";
        this.strasze = "";
        this.plzort = "";
        this.ort = "";
        this.telStartTxt = "";
        this.telEndDefault = "";
        this.faxStartTxt = "";
        this.faxEndTxt = "";
    }
   
    public Branch(int id, String label, String strasze, String plzort, String ort, int vorwahl, long telStartNum, String telStartTxt,
        String telEndDefault, String faxStartTxt, String faxEndTxt){
        this.id = id;
        this.label = label;
        this.strasze = strasze;
        this.plzort = plzort;
        this.ort = ort;
        this.vorwahl = vorwahl;
        this.telStartNum = telStartNum;
        this.telStartTxt = telStartTxt;
        this.telEndDefault = telEndDefault;
        this.faxStartTxt = faxStartTxt;
        this.faxEndTxt = faxEndTxt;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getVorwahl() {
        return vorwahl;
    }

    public void setVorwahl(int vorwahl) {
        this.vorwahl = vorwahl;
    }

    public long getTelStartNum() {
        return telStartNum;
    }

    public void setTelStartNum(long telStartNum) {
        this.telStartNum = telStartNum;
    }

    public String getLabel() {
        return label;
    }

    public void setLabel(String label) {
        this.label = label;
    }

    public String getStrasze() {
        return strasze;
    }

    public void setStrasze(String strasze) {
        this.strasze = strasze;
    }

    public String getPlzort() {
        return plzort;
    }

    public void setPlzort(String plzort) {
        this.plzort = plzort;
    }

    public String getOrt() {
        return ort;
    }

    public void setOrt(String ort) {
        this.ort = ort;
    }

    public String getTelStartTxt() {
        return telStartTxt;
    }

    public void setTelStartTxt(String telStartTxt) {
        this.telStartTxt = telStartTxt;
    }

    public String getTelEndDefault() {
        return telEndDefault;
    }

    public void setTelEndDefault(String telEndDefault) {
        this.telEndDefault = telEndDefault;
    }

    public String getFaxStartTxt() {
        return faxStartTxt;
    }

    public void setFaxStartTxt(String faxStartTxt) {
        this.faxStartTxt = faxStartTxt;
    }

    public String getFaxEndTxt() {
        return faxEndTxt;
    }

    public void setFaxEndTxt(String faxEndTxt) {
        this.faxEndTxt = faxEndTxt;
    }
   
}

Bei der Anwendung des Objektes Branch tue ich mich noch etwas schwer:
Java:
    public List<Branch> findNames2(Location where) throws SQLException{
        String sql = queries.get(where);
        try(PreparedStatement pst = conn.prepareStatement(sql)){
            try(ResultSet rs = pst.executeQuery()){
                List<Branch> result = new ArrayList<>();
                Branch b = new Branch();
                String label = result.getLabel();
                while(rs.next()){
                    result.setLabel((rs.getString("Label"));
                }
                return result;            
            }
        }
    }
Das ist natürlich noch falsch, weiß aber grad nicht wie man das richtig macht o_O
 
Zuletzt bearbeitet:
mihe7

mihe7

Top Contributor
Ja, sowas in der Richtung :)

Sorry, wenn ich etwas kurz angebunden bin, hab im Moment keine Zeit.

Bei der Anwendung des Objektes Branch tue ich mich noch etwas schwer:
Du schreibst Dir am besten eine Methode, die aus einem ResultSet ein komplettes Branch-Objekt einliest. Und die Methode rufst du dann in den entsprechenden anderen Methoden auf.

BTW: ich meine, mich zu erinnern, Eclipselink im Projekt gesehen zu haben. Damit würde die Abbildung automatisch funktionieren.
 
M

maGG

Bekanntes Mitglied
BTW: ich meine, mich zu erinnern, Eclipselink im Projekt gesehen zu haben. Damit würde die Abbildung automatisch funktionieren.
Ne, benutze Netbeans IDE
Meinst du evtl., dass ich ich bei Propierties bei "Type Parameters" das Feld mit "<String>" rauslösche? Dann wäre die ComboBox glaub vom Typ Object.

So vielleicht?
Java:
    public Branch findNames2(Location where) throws SQLException{
        String sql = queries.get(where);
        try(PreparedStatement pst = conn.prepareStatement(sql)){
            try(ResultSet rs = pst.executeQuery()){
                Branch result = new Branch();
                while(rs.next()){
                    result.setLabel((rs.getString("Label")));
                }
                return result;           
            }
        }
    }
Sorry, wenn ich etwas kurz angebunden bin, hab im Moment keine Zeit.
Kein Ding, du hast mir schon so viel geholfen! Ich muss auch mal selbst was hinbekommen, ist nur echt schwer manchmal, wenn man sowas noch nie gemacht experimentiert man sich kaputt, und kommt oft auf dem Schlauch :D
 
mihe7

mihe7

Top Contributor
Ne, benutze Netbeans IDE
LOL, nein ich meinte nicht die IDE Eclipse sondern die Bibliothek "Eclipselink" der Eclipse Foundation. Eclipselink ist die Referenzimplementierung der JPA (Java Persistence API). Es handelt sich um einen Object-Relational-Mapper (ORM).

Meinst du evtl., dass ich ich bei Propierties bei "Type Parameters" das Feld mit "<String>" rauslösche? Dann wäre die ComboBox glaub vom Typ Object.
Du kannst als Typparameter Branch angeben (JComboBox<Branch>).

Vielleicht komme ich später noch dazu...
 

Ähnliche Java Themen


Oben