Derby Datenbank speichert nicht

L

LeoxD

Gast
Hi,

Ich bin gerade dabei mir ein Adressbuch zu schreiben und habe für die Datenhaltung Derby verwendet. Ich habe meine Fachklassen bereits fertig und versuche gerade erste Tests. In meiner main-funktion erstell ich einen neuen Kontakt, füge ihn über meinen Kontaktverwalter hinzu der ihn dann auch der Datenhaltung hinzufügt. Normalerweise müsste beim 2ten Start ein Fehler kommen, dass der Kontakt bereits in der DB ist, aber dies geschieht nicht. Kann mir einer von euch sagen warum?

Java:
package datenbank;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import Kontakt.Kontakt;

public class KontaktDAO {
	
	private static KontaktDAO dasKontaktDAO = new KontaktDAO();
	private Connection dbVerbindung;
	
	private KontaktDAO()
	{
		try
		{
			Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
			dbVerbindung = DriverManager.getConnection("jdbc:derby:Datenbank;");
			
			try
			{
				dbVerbindung.createStatement().executeUpdate("CREATE TABLE kontakte (" +
							"id INT NOT NULL," +
							"vorname VARCHAR(50) NOT NULL," +
							"nachname VARCHAR(50) NOT NULL," +
							"privadr VARCHAR(100) NOT NULL," +
							"privtel VARCHAR(50) NOT NULL," +
							"privmobil VARCHAR(50) NOT NULL," +
							"privfax VARCHAR(50) NOT NULL," +
							"geschadr VARCHAR(100) NOT NULL," +
							"geschtel VARCHAR(100) NOT NULL," +
							"geschfax VARCHAR(50) NOT NULL," +
							"PRIMARY KEY(id))");
			}
			catch (Exception ex)
			{
			}
		}
		catch (Exception ex)
		{
			ex.printStackTrace();
		}
	}
	
	public static KontaktDAO getInstance()
	{
		return dasKontaktDAO;
	}
	
	public void create(Kontakt k)
	{
		try
		{
			PreparedStatement prepStatement = dbVerbindung.prepareStatement("INSERT INTO kontakte VALUES(?,?,?,?,?,?,?,?,?,?)");
			prepStatement.setInt(1, k.getId());
			prepStatement.setString(2, k.getVorname());
			prepStatement.setString(3, k.getNachname());
			prepStatement.setString(4, k.getPrivatAdresse());
			prepStatement.setString(5, k.getPrivatFestnetz());
			prepStatement.setString(6, k.getPrivatHandy());
			prepStatement.setString(7, k.getPrivatFax());
			prepStatement.setString(8, k.getGeschAdresse());
			prepStatement.setString(9, k.getGeschFestnetz());
			prepStatement.setString(10, k.getGeschFax());
		}
		catch (Exception ex)
		{
			ex.printStackTrace();
		}
	}
	
	public Kontakt read(int id)
	{
		try
		{
			PreparedStatement prepStatement = dbVerbindung.prepareStatement("SELECT vorname, nachname, privadr, privtel, privmobil, privfax, geschadr, geschtel, geschfax FROM kontakte WHERE id = ?");
			prepStatement.setInt(1, id);
			ResultSet ergebnis = prepStatement.executeQuery();
			if (ergebnis.next())
			{
				Kontakt k = new Kontakt(id, ergebnis.getString(1), ergebnis.getString(2), ergebnis.getString(3), ergebnis.getString(4), ergebnis.getString(5), ergebnis.getString(6),
								ergebnis.getString(7), ergebnis.getString(8), ergebnis.getString(9));
				
				return k;
			}
		}
		catch (Exception ex)
		{
			ex.printStackTrace();
		}
		return null;
	}
	
	public void update(Kontakt k)
	{
		try
		{
			PreparedStatement prepStatement = dbVerbindung.prepareStatement("UPDATE kontakte SET vorname = ?, nachname = ?,"
																			+"privadr = ?, privtel = ?, privmobil = ?, privfax = ?,"
																			+"geschadr = ?, geschtel = ?, geschfax = ? WHERE id = ?");
			prepStatement.setInt(10, k.getId());
			prepStatement.setString(1, k.getVorname());
			prepStatement.setString(2, k.getNachname());
			prepStatement.setString(3, k.getPrivatAdresse());
			prepStatement.setString(4, k.getPrivatFestnetz());
			prepStatement.setString(5, k.getPrivatHandy());
			prepStatement.setString(6, k.getPrivatFax());
			prepStatement.setString(7, k.getGeschAdresse());
			prepStatement.setString(8, k.getGeschFestnetz());
			prepStatement.setString(9, k.getGeschFax());
		}
		catch (Exception ex)
		{
			ex.printStackTrace();
		}
	}
	
	public void delete(Kontakt k)
	{
		try 
		{
			PreparedStatement prepStatement = dbVerbindung.prepareStatement("DELETE FROM kontakte WHERE id = ?");
			prepStatement.setInt(1, k.getId());
			prepStatement.executeUpdate();
		}
		catch (Exception ex)
		{
			ex.printStackTrace();
		}
	}
	
	public Iterator<Kontakt> ordneKontakteNachAlphabet()
	{
		try
		{
			ResultSet rs = dbVerbindung.createStatement().executeQuery("SELECT id FROM kontakte ORDER BY nachname DESC");
			List<Kontakt> kontaktlist = new ArrayList<Kontakt>();
			
			while (rs.next())
			{
				kontaktlist.add(read(rs.getInt(1)));
			}
			
			Iterator<Kontakt> kontaktirt= kontaktlist.iterator();
			
			return kontaktirt;
				
		}
		catch (Exception ex)
		{
			return null;
		}
	}
}

Java:
package Kontakt;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Observable;
import java.util.Observer;
import java.util.Vector;

import datenbank.KontaktDAO;


public class Kontaktverwalter implements Observer{
	
	private HashMap<Integer, Kontakt> kontaktliste = new HashMap<Integer, Kontakt>();
	private KontaktDAO datenquelle = KontaktDAO.getInstance();
	private static Kontaktverwalter eineKontaktVerwaltung = new Kontaktverwalter();
	
	private Kontaktverwalter()
	{
	}
	
	public static Kontaktverwalter getInstance()
	{
		return eineKontaktVerwaltung;
	}
	
	public Kontakt finden(int id) throws KontaktException
	{
		Kontakt ergebnis = null;
		
		ergebnis = kontaktliste.get(id);
		if (ergebnis != null)
			return ergebnis;
		
		try
		{
			ergebnis = datenquelle.read(id);
			if (ergebnis != null)
				kontaktliste.put(id, ergebnis);
		}
		catch (Exception ex)
		{
			throw new KontaktException("Kontakt" + id + "konnte nicht gefunden werden");
		}
		return ergebnis;
	}
	
	public void hinzufuegen(Kontakt kontakt) throws KontaktException
	{
		int id = kontakt.getId();
		
		try
		{
			if ((kontaktliste.containsKey(id)) || (datenquelle.read(id) != null))
			{
					throw new KontaktException("Kontakt mit dieser Id ist schon vorhanden");
			}
			
			kontaktliste.put(kontakt.getId(), kontakt);
			datenquelle.create(kontakt);
			
			kontakt.addObserver(this);
		}
		catch (Exception ex)
		{
			throw new KontaktException("Kontakt "+id+" konnte nicht gespeichert werden");
		}
	}
	
	public void entfernen(Kontakt kontakt) throws KontaktException
	{
		kontaktliste.remove(kontakt.getId());
		
		try
		{
			datenquelle.delete(kontakt);
		}
		catch (Exception ex)
		{
			throw new KontaktException("Kontakt konnte nicht entfernt werden");
		}
	}
	
	public Vector<Kontakt> ordneKontakteNachAlphabet() throws KontaktException
	{
		try
		{
			Vector<Kontakt> ergebnis = new Vector<Kontakt>();
			Iterator<Kontakt> it = datenquelle.ordneKontakteNachAlphabet();
			
			while (it.hasNext())
			{
				ergebnis.add(it.next());
				kontaktliste.put(it.next().getId(), it.next());
			}
			return ergebnis;
		}
		catch (Exception ex)
		{
			throw new KontaktException("KontaktListe nicht aufrufbar");
		}
	}

	@Override
	public void update(Observable o, Object arg) 
	{
		Kontakt kontakt = (Kontakt) o;
		
		try
		{
			datenquelle.update(kontakt);
		}
		catch (Exception ex)
		{
			ex.printStackTrace();
		}
		
	}
}

Java:
package Logik;

import gui.KontaktGUI;

import javax.swing.SwingUtilities;

import Kontakt.Kontakt;
import Kontakt.KontaktException;
import Kontakt.Kontaktverwalter;

public class Adressbuch {

	public static void main(String[] args) 
	{
		Kontaktverwalter kv = Kontaktverwalter.getInstance();
		
		Kontakt test = new Kontakt(20, "Franz", "Busch", "test", "test", "test", "test","test","test","test");
		
		try {
			kv.hinzufuegen(test);
		} catch (KontaktException e) {
			System.out.println(e.getMessage());
		}
		
		
		
		SwingUtilities.invokeLater(new Runnable() 
		{
			public void run() 
			{
				KontaktGUI inst = new KontaktGUI();
				inst.setLocationRelativeTo(null);
				inst.setVisible(true);
			}
		});
	}

}
 
A

Andgalf

Gast
Du fängst an einigen Stellen Exceptions und reagierst nicht darauf. (Silent Catch) zB. KontakDao Zeile 40 und 154 Das ist keine gute praxis, da Du eventuelle Fehler dadurch verdeckst. Du solltest an den Stellen mindestens eine Log-Ausgabe schreiben ... ich vermute, dass ein Fehler bei der DB-Connection o.ä auftritt den Du nicht mitbekommst.

[TIPP]Außerdem fängst Du die Exceptions sehr pauschal ... google mal nach java exceptions und antipattern[/TIPP]

P.S. Eine static variable vom KontaktDao im KontaktDao zu halten sieht auch ziemlich merkwürdig aus... was bezweckst Du damit?
 
Zuletzt bearbeitet von einem Moderator:
L

LeoxD

Gast
Bezüglich deiner ersten Tipps Vielen Dank. Werd ich mir alles nochmal ganzgenau anschauen. Nun bezüglich der static Variable des KontaktDAO. Das ich in allen Klassen auf das selbe KontaktDAO Objekt zugreife und so wircklich nur eine Verbindung entsteht und es nur ein KontaktDAO Objekt gibt.
 

turtle

Top Contributor
Ich bin mir sehr sicher, dass da keine Exception über den bereits vorhandenen Key gibt, weil bereits vorher eine Exception kommt, nämlich das die Tabelle schon existiert.

Diese aber gibst Du nicht und das ist gaaanz :noe: schlechter Programmierstil, wie bereits angemerkt.

Zumindestens solltest Du einen Stacktrace bei der Entwicklung ausgeben.
 
L

LeoxD

Gast
Ok, auch danke. Ich werde das ganze mit den Exception nochmal anschauen. Die Exception, dass es die Tabelle bereits gibt is gewollt! Da es bei Derby kein "CREATE IF NOT EXIST" gibt kann man das auch so lösen.
 
A

Andgalf

Gast
Bezüglich deiner ersten Tipps Vielen Dank. Werd ich mir alles nochmal ganzgenau anschauen. Nun bezüglich der static Variable des KontaktDAO. Das ich in allen Klassen auf das selbe KontaktDAO Objekt zugreife und so wircklich nur eine Verbindung entsteht und es nur ein KontaktDAO Objekt gibt.

Ok, du willst dort einen Singleton haben, das verstehe ich. Aber warum ist dann der Kontaktverwalter auch ein Singleton?

Sauberer wäre es auch, wenn Du die DBConnection in einem Singleton kapselst und nicht das ganze DAO.

Mit Singletons sollte man sparsam umgehen. guck mal hier unter Nachteile:

http://de.wikipedia.org/wiki/Singleton_(Entwurfsmuster)
 
L

LeoxD

Gast
Ja, das hatte ich am Anfang auch aber, es hatte nicht funktioniert und mir immer einen Error an den Kopf geworfen :p
 
L

LeoxD

Gast
Sorry, für den Doppelpost aber ich kann ja noch nicht editieren.
Also wegen dem Singleton, ich bin kein Javaprofi und arbeite gerade ein Buch durch dort wird beides als Singleton verwendet, da es ein Artikel,Lieferanten,Benutzer-Kunden Programm ist. Also entschuldigung fals das nicht so gut ist, aber so steht es nunmal dort.
 
A

Andgalf

Gast
Also entschuldigung fals das nicht so gut ist, aber so steht es nunmal dort.

Also entschuldigen brauchst du dich dafür nicht. Wenn ich Kritik äußere, so hoffe ich dass diese immer konstruktiv verstanden wird.

Außerdem hätte es ja auch sein können, dass du dir dabei was gedacht hast und ich in dem Fall was lerne :rtfm:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
thor_norsk Datenbank: Apache Derby Datenbankprogrammierung 6
J Verbindung zu Derby Datenbank funktioniert nicht Datenbankprogrammierung 14
D Derby Datenbank bei Export zu JAR-Datei nicht möglich Datenbankprogrammierung 8
D Embedded Derby Datenbank Datenbankprogrammierung 4
H Derby/JavaDB Eine verschlüsselte Derby-Datenbank wieder entschlüsseln Datenbankprogrammierung 4
P Zugreifen auf Derby Datenbank mit java (ÜBERARBEITET) Datenbankprogrammierung 2
S Derby Datenbank "offline" und "online" Datenbankprogrammierung 5
T Zugriff auf Derby-Datenbank will einfach nicht klappen Datenbankprogrammierung 22
B Java Derby Datenbank mit CLOB & BLOB Datenbankprogrammierung 5
P derby datenbank Datenbankprogrammierung 2
B Cloudscape/Derby NetworkServer als JDBCRealm Datenbank Datenbankprogrammierung 2
O apache derby in eclipse für Datenbanken einbauen Datenbankprogrammierung 3
F Derby Datenbankprogrammierung 5
T importierte Derby DB währen der Laufzeit einlesen Datenbankprogrammierung 2
L Derby/JavaFX Fehlermeldung Datenbankprogrammierung 3
R findet Derby.DB nicht !? Datenbankprogrammierung 5
K Eclipse Apache Derby Treiber Problem Datenbankprogrammierung 4
J Derby/JavaDB Datenbankanbindung Eclipse und Derby Datenbankprogrammierung 7
M JAVA Derby INSERT probleme Datenbankprogrammierung 12
T Datenbankfeld in Derby 255 Zeichen Datenbankprogrammierung 3
M Derby/JavaDB Derby SQL Insert mit AUTO_INCREMENT, welche ID wurde vergeben? Datenbankprogrammierung 6
C Derby auf Server Datenbankprogrammierung 6
R derby : in squirrel url zu db von tomcat Datenbankprogrammierung 4
H Derby: SYSCS_UTIL.SYSCS_EXPORT_QUERY mit String Abfrage in wehre-Klausel nicht möglich Datenbankprogrammierung 3
H Probleme mit Unicodedarstellung in Derby DB Datenbankprogrammierung 1
S Dringend Netbeans Derby DB random() function Datenbankprogrammierung 6
M HSQLDB oder DERBY - warum SCRIPT Datei? Datenbankprogrammierung 0
B Derby/JavaDB Einrichten der Derby DB / JAVA DB Datenbankprogrammierung 2
A Eclipse + Derby + Delete Row Datenbankprogrammierung 3
reibi Derby/JavaDB Derby DB löschen Datenbankprogrammierung 5
N Query für Derby DB mit Enterbrise Bean Datenbankprogrammierung 4
S Derby/JavaDB Derby zu MySQL Datenbankprogrammierung 6
G Derby/H2 Welches u. Wie installieren/verwenden? Datenbankprogrammierung 10
L Derby/JavaDB Derby macht Probleme Datenbankprogrammierung 4
zilti Derby/JavaDB EclipseLink und Derby: "Abschneidefehler" bei @Lob Datenbankprogrammierung 2
B Derby Databankabfrage liefert Ergebnisse nicht korrekt Datenbankprogrammierung 2
H Derby SQL-Abfragen in Datei abspeichern Datenbankprogrammierung 2
H Flat Files in Derby importieren Datenbankprogrammierung 3
reibi Derby/JavaDB Derby russty manager deaktivieren Datenbankprogrammierung 3
L Derby Dezimal-Spalte die Größe ändern Datenbankprogrammierung 2
D PostgreSQL vs Firebird vs Derby Datenbankprogrammierung 12
R Lokale Derby in einer JPA-Anwendung Datenbankprogrammierung 3
S Derby ein zweites mal als Read-only öffnen Datenbankprogrammierung 9
M Derby insert, ID auslesen Datenbankprogrammierung 3
J Derby Datenbankprogrammierung 7
L Apache Derby Management-Tool Datenbankprogrammierung 3
A JavaDB(Derby) als ODBC-Datenquelle eintragen Datenbankprogrammierung 4
T Derby und Foreign Keys Datenbankprogrammierung 4
I JAVADB (Derby) OneToMany Datenbankprogrammierung 2
M Gelöst: JavaDB - Derby Inhalt in Jar Datei speichern Datenbankprogrammierung 5
O Derby/JavaDB anwenden von Regular Expressions Datenbankprogrammierung 2
O Derby Performance Probleme? Datenbankprogrammierung 4
H Derby in Java 6 direkt integriert? Wie nutzt man das? Datenbankprogrammierung 3
Z derby abfrage von einem Timestamp Datenbankprogrammierung 2
GilbertGrape Allgemeines zu Derby Datenbankprogrammierung 7
M JavaDB/Derby: Tabellen erstellen Datenbankprogrammierung 8
G Derby Anleitung? Datenbankprogrammierung 1
H Migration von MySQL auf Derby Datenbankprogrammierung 2
vogella Java DB (Derby) Size Datenbankprogrammierung 12
J Derby Cursor Problem Datenbankprogrammierung 2
R Wie stabil ist Derby? Datenbankprogrammierung 2
D Installation von Apache Derby in Eclipse Datenbankprogrammierung 1
P DERBY vs HSQLDB (Vor- Nachteile) Datenbankprogrammierung 3
P Apache DERBY - Datanbank erstellen Datenbankprogrammierung 2
torresbig MySQL hibernate - could not resolve entity class ... (Datenbank Anfänger) Datenbankprogrammierung 19
M Meine Datenbank lässt sich mit meiner Methode nicht ändern Datenbankprogrammierung 1
I SaaS Applikation: pro Kunde eine Datenbank / Schema oder eine DB für alle Kunden? Datenbankprogrammierung 76
T SQL-Statement Datenbank nach SQL Statement schließen? Datenbankprogrammierung 7
M Datenbank Zugraff nach Umwandlung in .jar-Datei nicht mehr möglich Datenbankprogrammierung 4
Auf MySql Datenbank zugreifen funktioniert nicht Datenbankprogrammierung 8
MongoDB-Datenbank in Androidstudio einbinden Datenbankprogrammierung 1
B SQlite Datenbank, trotz Statements wurden nicht alle Zeilen erzeugt? Datenbankprogrammierung 35
M Datenbank mit REST API Datenbankprogrammierung 66
M Entfernte Datenbank Datenbankprogrammierung 11
T Datenbank: Tabelle erstellen bei Web-Applikation Datenbankprogrammierung 4
D SQLite Datenbank in Android Studio (Java) durchsuchen Datenbankprogrammierung 3
M MySQL Datenbank in Array Datenbankprogrammierung 2
S Den letzten Eintrag aus Datenbank ziehen (Oracle SQL Dev.) Datenbankprogrammierung 14
N Datenbank abfragen nach bestimmten Wort Datenbankprogrammierung 7
Beginner22 Zugriff auf Datenbank aus Java über mariadb Datenbankprogrammierung 3
ma095 value NULL- Datenbank Postgresql Spring - intellij community Datenbankprogrammierung 0
raptorrs Plötzlich keine Verbindung zur Datenbank mehr möglich Datenbankprogrammierung 14
Davee SQLite SQLite Datenbank lässt sich nicht auf anderen PCs öffnen Datenbankprogrammierung 8
P Datenbank Tool - besser als oracle SQL Developer gesucht mit effizinte Verbindungsverwaltung Datenbankprogrammierung 2
X JPA (EclipseLink) und Oracle Datenbank Datenbankprogrammierung 2
T Datenbank auf einer Webseite aus einer Exceltabelle erstellen Datenbankprogrammierung 5
L SQL Datenbank Datenbankprogrammierung 7
L SQL Datenbank INSERT INTO Datenbankprogrammierung 6
L SQL Datenbank Tabelle insert Datenbankprogrammierung 7
L SQL Datenbank Tabelle erstellen Datenbankprogrammierung 6
nonickatall MySQL Auf neue Datensätze in einer Datenbank reagieren Datenbankprogrammierung 5
W MYSQL Datenbank Login Android Datenbankprogrammierung 3
anton1 Online Datenbank Datenbankprogrammierung 7
krgewb H2-Datenbank öffnen Datenbankprogrammierung 8
J Datenbank abfragen Datenbankprogrammierung 6
P Verbindung zu einer Access Datenbank per Eclipse oder Intellij Datenbankprogrammierung 0
O SQL Abfragen mit Mini Datenbank Datenbankprogrammierung 12
Z Datenbank Choicebox wird nicht befüllt Datenbankprogrammierung 15
S Suche In SQL Datenbank mit array Datenbankprogrammierung 6
P Enum in der Datenbank Datenbankprogrammierung 1

Ähnliche Java Themen

Neue Themen


Oben