Derby/JavaDB Neu geschriebener Eintrag per UPDATE lässt sich nicht unmittelbar abrufen

Midgard

Neues Mitglied
Hallo zusammen,

mich beschäftigt seit geraumer Zeit ein Problem mit Apache Derby und dem EntityManager.
Ich habe einen Quellcode übernommen, kann diese Person aber dazu im Moment nicht befragen.
Folglich steige ich durch einige Dinge nicht so durch, weil es Fremdcode ist.

Im Moment schreibe ich mehrere Datensätze in die Datenbank und bearbeite diese.
In dem Programm möchte ich gleich danach auch darauf zugreifen können.

Leider ist es so, dass neu eingepflegte Datensätze erst nach einem Neustart des Programms (ich vermute also nach einem neuen öffnen der Datenbank) mit SELECT abgerufen werden können. Wie kann dies trotz Commit Befehl passieren?


Der Update Code ist ca. wie folgt:

Java:
if(!entityManager.getTransaction().isActive()) entityManager.getTransaction().begin();
Query q = entityManager.createQuery("UPDATE Daten1 d SET name= :name WHERE d.id= :id");
q.setParameter("name", name1);
q.setParameter("id", id1);
q.executeUpdate();
entityManager.getTransaction().commit();

Möchte ich an späterer Stelle und in anderer Methode etwas selektieren, sieht das wie folgt aus:

Java:
List<Daten1> liste1 = new ArrayList<Daten1>();
liste1 = entityManager.createQuery("SELECT d FROM Daten1 d WHERE d.id < 10").getResultList();
for (int i = 0; i < exportVuls.size(); i++) {
    Daten1 d = liste1.get(i);
    System.out.println(d.name()+" " + d.id());
}

Woran liegt diese zeitliche Verzögerung? Ich möchte das Programm nicht neustarten müssen, um auf neue Ergebnisse zurückgreifen zu können.
Der FlushMode ist übrigens "Auto", falls dies relevant ist.

Besten Dank schon mal.
 
Hallo Forumsmitglieder!

Auf der suche nach einer Lösung meines Problems bin ich via google direkt hirher gekommen.
denn auch ich habe fast das selbe Problem, wie Midgard auch (denke ich).

IDE: Eclipse, JDK 1.7, Datenbank = Derby, Auto-Commit = false
Bei mir stellt sich das folgendermaßen dar: Ich mache ein INSERT in eine Tabelle und möchte per SELECT drauf zugreifen da es sich um Daten handelt die ich zur Laufzeit verwende. (wird das Program geschlossen werden diese Daten per UPDATE aktualisiert).
INSERT:
Java:
nrmap = new HashMap<String, Numberranges>();
			try {
				while (rs.next()) {
					//wenn er hier rein geht, wissen wir, dass es zumindest einen Datensatz gibt
					//in der NRRANGES Tabelle, also helper auf true setzen
					bo_help	=	true;
					nrr_tmp = new Numberranges();
					nrr_tmp.setObj(rs.getString("obj"));
					nrr_tmp.setVon(rs.getString("von"));
					nrr_tmp.setBis(rs.getString("bis"));
					nrr_tmp.setStand(rs.getString("stand"));
					nrr_tmp.setAktiv(rs.getString("aktiv"));

					nrmap.put(nrr_tmp.getObj(), nrr_tmp);
					nrr_tmp = null;
				}
				
			} 
			catch (SQLException sqlex) {
				System.out.println("Fehler in Numberranges...leer?");
				System.out.println(sqlex.getMessage().toString());
				sqlex.printStackTrace();
			}
			//die Numberranges waren nicht auf der DB zu finden also legen wir sie an
			if (bo_help == false) {
				locdb	=	database;
				initNrsaetze();				
			}
			//und damit wir zur Laufzeit auch damit arbeiten können, starten wir noch einen Leseversuch
			rs = null;
			database.deleteconn();
			rs	=	database.select(sqlselect);
			if (rs == null) {
				
			}
			else {
				try {
					//Quellcode wie oben!!
					bo_help	=	true;
					nrr_tmp = new Numberranges();
					nrr_tmp.setObj(rs.getString("obj"));
					nrr_tmp.setVon(rs.getString("von"));
					nrr_tmp.setBis(rs.getString("bis"));
					nrr_tmp.setStand(rs.getString("stand"));
					nrr_tmp.setAktiv(rs.getString("aktiv"));

					nrmap.put(nrr_tmp.getObj(), nrr_tmp);
					nrr_tmp = null;
					
				} catch (SQLException sqlex) {
					// TODO: handle exception
				}
			}
Zu beachten ist, das (beim zweiten try Block) keine SQL Exception geworfen wird. Im Debugger komme ich bis zur Stelle
Code:
nrr_tmp.setObj(rs.getString("obj"));
.
(rs = ResultSet; nrr_tmp ist eine von mir geschriebene Klasse mit setter(String)-Methode.
Die Befehle
Code:
rs = null;
und
Code:
database.deleteconn();
sind schon Versuche von mir das ganze irgendwie hinzhubekommen. Und wie gesagt, wenn ich das Programm schließe und neu aufrufe, funktioniert auch das SELECT?!

Irgendjemand eine Idee? Besten Dank für eure Unterstützung
 
Hallo zusammen. Ich hab den Fehler mittlerweile gefunden. Man sieht in auch in meinem Quellcodeausschnitt.
Das was ich in Zeile 3 mache (
Code:
while (rs.next()) {
), hätte ich unten (ca. Zeile 38 ) auch machen sollen.
Dadurch das der Zeiger des ResultSets auf beforeFirst steht springt er bei der ersten get-Anweisung
des ResultSets aus dem try raus (ohne Exception).
Hätt ich gleich drauf kommen können...
 

Neue Themen


Zurück
Oben