2009-08-01 14 views
3

Ich möchte einige meiner Tabelle in der Datenbank aktualisieren und wollen alle diese Arbeit in 1 Transaktion, erstens löschen ich einige Einträge in branchbuildin (Tabelle) und neue nach dieser Aktion einfügen Das Problem trat auf, wenn ich mit demselben buildname und branch_fk einfüge und eingebe (weil ich diese Beschränkung für diese Tabelle habe (uniqueConstraints = {@ UniqueConstraint (columnNames = {"buildingname", "branch_fk"})})), aber wenn ich nicht verwende Hibernate-Sitzung und verwenden normale JDBC-Transaktion Ich habe dieses Problem nicht.Hibernate-Transaktion doppeltes Problem

List<Integer> allBranchBuilding = branchBuildingDao.getAllBranchBuildingID(pkId, sess); 
      for (Integer integer : allBranchBuilding) { 
       branchBuildingDao.delete(integer, sess); // delete kardane tamame BranchBuilding ha va tel haie aanha 
      } 

      Address myAdr = new Address(); 
      setAddress(myAdr, centralFlag, city, latit, longit, mainstreet, remainAdr, state); 
      BranchBuildingEntity bbe = new BranchBuildingEntity(); 
      setBranchBuildingEntity(bbe, be, myAdr, city, centralFlag, latit, longit, mainstreet, buildingName, remainAdr, state, des); 
      branchBuildingDao.save(bbe, sess);//Exception Occurred     

ich meine Session am ersten Methode:

 Session sess = null; 
     sess = HibernateUtil.getSession(); 
     Transaction tx = sess.beginTransaction(); 

Antwort

6

Du hast Recht, alles geschieht in der gleichen Transaktion, und die gleiche Hibernate Session.

Die Sitzung verfolgt jede von ihr verwaltete Entität. Obwohl Sie aufgefordert wurden, es in der Datenbank zu löschen, wird das entsprechende Objekt in der Sitzung gespeichert, bis die Sitzung beendet wird.

Im Allgemeinen ist es möglich, dass Hibernate Ihren Betrieb neu ordnet , wenn sie in die Datenbank, für Effizienzgründen zu senden.

Was Sie tun können, ist bündig Ihre Transaktion (dh an die Datenbank senden.), Weil das Speichern (falls nötig, man kann auch klar - dh leeren die von der Session gespeicherten Entitäten - es nach dem Spülen):

Beachten Sie auch, dass Ihre Entitäten während der Sitzung gespeichert werden. Wenn Sie sie ändern, wird beim Schließen der Sitzung eine automatische Aktualisierung ausgelöst.

In unserem Projekt haben wir eine Methode, die effizient eine Sammlung löscht (und eine andere für ein Array, erklärt die komfortable ... Parameter-Syntax) von Einheiten (es für alle Unternehmen arbeitet, ist es nicht für erledigt werden müssen, jede juristische Person), um sie aus der Sitzung zur gleichen Zeit, und die Betreuung der Spülung vor dem Entfernen:

  1. Schleife auf allen Unternehmen, löschen (mit sess.delete(e)) und es zu einer "deleteds Liste hinzuzufügen.
  2. Alle 50 Einheiten (entsprechend der Chargengröße, die wir aus Effizienzgründen konfiguriert) (und am Ende):
    • bündig die Session Hibernate zu zwingen, sofort die Änderungen an der Datenbank zu senden,
    • Schleife auf Löschen Sie jede Entität aus der Sitzung (mit sess.evict(e)).
    • leeren Sie die "deleteds" -Liste.

Keine Sorge, bündig sendet nur die SQL in die Datenbank. Es unterliegt noch dem Commit oder Rollback.

+0

Tanx aber was passiert, wenn ich die Sitzung flush und danach meine Verbindung CUTOFF führt die Transaktion Rollback nach Flush? Ich brauche alle meine Arbeit in einer Transaktion (kann ich Flush zwischen ihnen und dun verletzen Transaktion Rollback und Commit?) – Am1rr3zA

+0

KLE ist richtig (außer "evict()" auf einer zuvor gelöschten Entität aufzurufen, was sehr fraglich ist, aber für das vorliegende Problem nicht relevant ist) "flush" ist nur ein Prozess zum Synchronisieren des Sitzungsstatus mit der Datenbank, z. Es werden die erforderlichen Anweisungen zum Einfügen/Aktualisieren/Löschen in die Datenbank ausgegeben. In Bezug auf die Transaktion unterscheidet sich nichts von der manuellen Abgabe der gleichen Anweisungen - es sei denn, eine Transaktion ist festgeschrieben, werden alle diese Anweisungen zurückgesetzt (wegen expliziten Rollbacks, abgebrochener Verbindung, Serversterben, was hast du). – ChssPly76

+0

@ ChssPly76 Hallo. Ich bin neugierig auf Ihren "Räumungs" -Kommentar. Könnten Sie das Thema näher erläutern? – KLE