# Kopieren eines Datensatzes



## jambusa (11. Jan 2010)

Hallo zusammen,

folgendes ist gegeben: Eine Tabelle (mysql) mit etwa 120 Spalten. Diese besitzt einen primary key mit autoincrement und einigen foreign keys auf andere Tabellen. Nun möchte ich in meiner Java-Applikation ermöglichen, diesen Datensatz in identischer Form erneut anzulegen, nur mit einer anderen id (autoincrement). 

Nun habe ich ja grundsätzlich 2 Optionen. Entweder lege ich in Java ein neues Domain-Objekt an, weise die entsprechenden werte zu (ggfls über BeanUtils.copyProperties), dann einige Nachbesserungen in den Settern (2 felder unterscheiden sich beim neu anlegen) und saven des Objektes, was vermutlich der elegantere Weg wäre, oder

über einen SQL befehl diesen Datensatz kopieren. Da bin ich auf folgenden Befehl gestoßen: 

INSERT INTO _TABELLENNAME_ (_SpalteX, SpalteY_) SELECT _SpalteX, SpalteY_ FROM _TABELLENNAME _WHERE _ID_ = " + id

Da ich jedoch nicht 120 Spalten angeben möchte, hab ich mich gefragt, ob ich in MYSQL etwas wie "Alle Spalten bis auf xyz" angeben kann, jedoch würde mich zunächst interessieren, was ihr generell für den besseren Weg haltet und warum. Oder ob ich gar einen ganz anderen Lösungsweg vorgehen sollte.

Grüße,
jambusa


----------



## Janus (11. Jan 2010)

Der Vorteil der reinen SQL Lösung ist, dass ein einziger Befehl genügt, um auch mehrere Zeilen gleichzeitig zu kopieren. Gerade in solchen Fällen ist die Lösung auch wesentlich performanter.


----------



## jambusa (11. Jan 2010)

genau das habe ich mir auch gedacht, da BeanUtils auch beim Zuweisen der Properties schon immer eine kleine Performancebremse beim Beziehen der Daten war.

Müsst ich dann deiner Meinung nach alle 120 Spalten (das Design ist leider so vorgegeben) im SQL Befehl angeben , oder hast du da noch eine Alternative parat? Ich würd ungern immer diesen SQL Befehl mitpflegen, wenn sich an der Tabellenstruktur etwas verändert.


----------



## SlaterB (11. Jan 2010)

Select auf alle Spalten außer... - Entwickler-Forum


----------



## jambusa (21. Jan 2010)

Danke für den Link, inzwischen konnte ich mir einen entsprechenden SQL String zusammenbasteln. Doch nachdem ich mich nun längere Zeit damit auseinander gesetzt habe, ist mir bewusst geworden, dass das eigentliche Problem die Referenzen der einzelnen Entitäten untereinander sind.

Leider kann ich nicht einfach nen dump der kompletten Datenbank machen, da die Datensätze in die gleichen Tabellen eingefügt werden, daher muss ich mir sowohl die ursprüngliche ID der kopierten Datensätze merken als auch die neu zugewiesene der neuen Datensätze um die Referenzen im Nachhinein wieder herstellen zu können.

Beispiel: Tabelle Wald, Tabelle Baum und Tabelle Blätter. Baum kann mehrere Blätter haben, Blätter haben nur einen Baum. Beim Kopieren der Tabelle Baum, möchte ich natürlich auch die zugehörigen Blätter der Bäume kopieren und in einem neuen Wald ablegen.

Bin das Ganze dann mal iterativ durchgegangen und hab über PropertyUtils.copyProperties() die DomainObjekts kopiert und unter der neuen ID ablegt und dann abgefragt, ob der Baum Blätter hat, und diese dann gleich mit einbezogen und die entsprechenden Referenzen direkt neu gesetzt. Hat auch alles prima geklappt, allerdings dauert das Vorhaben (wie Janus schon angedeutet hat) sehr lang.

Hattet ihr schonmal einen vergleichbaren Fall? Falls ja, für welchen Weg habt ihr euch entschieden? Kann mir Hibernate dort womöglich auch etwas Arbeit abnehmen? Leider hab ich in der Hilfe dazu nichts konkretes gefunden.

Grüße,
jambusa


----------

