# Tabelle Updaten aber auch Speichern



## rbrose (30. Dez 2009)

Hallo zusammen,

leider ist der Titel nicht ganz aussagekräftig, aber mir ist nichts besseres eingefallen ;-)

Mein Problem:

Ich habe eine List mit mehreren "java.awt.Rectangle" Klassen. Einige Rectangle sind schon in der Datenbank und haben eine ID, andere sind neu und sind noch nicht in der DB. Ich kriege die ohne Probleme in die DB, aber wie kriege ich die ID die, die neue Box in der Datenbank bekommen hat in die List zurück?

Wenn die Seite noch nicht existiert weiss ich das die Boxen alle neu sind und ich mache es so:


```
if(boxTmp.getType().equals(InDesignComponents.TEXTBOX)) {
					TextBox textbox = (TextBox) boxTmp;
					
					Transaction tx = session.beginTransaction();
					
					Box boxDB = new Box();
					boxDB.setHeight(textbox.height);
					boxDB.setWidth(textbox.width);
					boxDB.setTyp(textbox.getType());
					boxDB.setX(textbox.x);
					boxDB.setY(textbox.y);
					
					boxes.add(boxDB);
					
					page.setBoxes(boxes);
					project.setPage(page);
					
					session.saveOrUpdate(project);
					tx.commit();
					
					textbox.setBoxID(boxDB.getBOX_ID());
				}
```

Das klappt auch und Texbox hat am Ende die ID.

Aber wenn die Seite und existiert, dann gibt es schon Boxen und es gibt evtl. neue.

Hier die ganze Methode:


```
public ProjectsTransfer savePage(ProjectsTransfer projectTransfer) {
		Session session = HibernateUtil.getSession();
		
		Projects project = (Projects) session.get(Projects.class, projectTransfer.getId());
		
		System.out.println("ProjectName: " + project.getName());
		System.out.println("Boxes Count: " + projectTransfer.getPage().getBoxes().size());
		
		if(project.getPage() == null) {
			Page page = new Page();
			page.setImagebox_count(0);
			page.setTxtbox_count(projectTransfer.getPage().getTxtbox_count());
			
			Collection<Box> boxes = new ArrayList<Box>();
			
			for (Iterator<InDesignComponents> box = projectTransfer.getPage().getBoxes().iterator(); box.hasNext();) {
				InDesignComponents boxTmp = box.next();
				
				if(boxTmp.getType().equals(InDesignComponents.TEXTBOX)) {
					TextBox textbox = (TextBox) boxTmp;
					
					Transaction tx = session.beginTransaction();
					
					Box boxDB = new Box();
					boxDB.setHeight(textbox.height);
					boxDB.setWidth(textbox.width);
					boxDB.setTyp(textbox.getType());
					boxDB.setX(textbox.x);
					boxDB.setY(textbox.y);
					
					boxes.add(boxDB);
					
					page.setBoxes(boxes);
					project.setPage(page);
					
					session.saveOrUpdate(project);
					tx.commit();
					
					textbox.setBoxID(boxDB.getBOX_ID());
				}
			}
			

		}
		else {
			Page page = project.getPage();
			
			Collection<Box> boxes = new ArrayList<Box>();
			
			Transaction tx = session.beginTransaction();
			
			for (Iterator<InDesignComponents> box = projectTransfer.getPage().getBoxes().iterator(); box.hasNext();) {
				InDesignComponents boxTmp = box.next();
				
				if(boxTmp.getType().equals(InDesignComponents.TEXTBOX)) {
					TextBox textbox = (TextBox) boxTmp;

					if(textbox.getBoxID() > 0) {
						Box boxDB = (Box) session.get(Box.class, textbox.getBoxID());
						boxDB.setHeight(textbox.height);
						boxDB.setWidth(textbox.width);
						boxDB.setTyp(textbox.getType());
						boxDB.setX(textbox.x);
						boxDB.setY(textbox.y);
						
						boxes.add(boxDB);
					} 
					else
					{
						Box boxDB = new Box();
						boxDB.setHeight(textbox.height);
						boxDB.setWidth(textbox.width);
						boxDB.setTyp(textbox.getType());
						boxDB.setX(textbox.x);
						boxDB.setY(textbox.y);

                                                textbox.setBoxID(boxDB.getBOX_ID());  <----- LEIDER IST ES NOCH "0" WEIL tx.commit noch nicht ausgeführt worden ist
						
						boxes.add(boxDB);
					}
				}
			}
			page.setBoxes(boxes);
			
			session.saveOrUpdate(project);
			tx.commit();
		}
		
		return projectTransfer;
	}
```


>  textbox.setBoxID(boxDB.getBOX_ID());  <----- LEIDER IST ES NOCH "0" WEIL tx.commit noch nicht ausgeführt worden ist

Wie kriege ich hier meine ID?


Vielen Dank für eure Hilfe im voraus.


----------



## rbrose (2. Jan 2010)

Keiner der mir helfen kann? oder ist das Problem nicht verständlich?


----------



## bronks (2. Jan 2010)

Wenn Du die ID unbedingt vor dem Commit brauchst, dann mußt Du Dich um die ID selbst kümmern und diese  in einer eigenen Tabelle während der Transaktion selbst erzeugen, wie es in J2EE üblich war. Ich wollte Dir ein Beispiel per Google raussuchen, aber leider ist alles mit den modernen und ungenügenden Schlüsselgeneratoren aus JPA versaut, sodaß ich leider nichts gefunden habe.


----------

