2011-01-09 8 views
3

ich versuche, mit Hibernate zu arbeiten (Datenbankseite für erstes Mal) und einige, wie bei der Auswahl optimal getroffen saveOrUpdate oder Save.Update zu verwenden ich habe ein Ziel POJO-Klasse und ihre anderen Attribute, die muss zusammen mit der Destination-Entität aktualisiert werden. Ich erhalte eine zu importierende XML-Datei und verwende den folgenden Code, um die Zieleinheit zusammen mit ihren Attributklassen zu aktualisieren/zu speichern.Hibernate saveorUpdate Methode Problem

try{ 
     getSessionFactory().getCurrentSession().beginTransaction(); 
     getSessionFactory().getCurrentSession().saveOrUpdate(entity); 
     getSessionFactory().getCurrentSession().getTransaction().commit(); 
     } 
     catch(Exception e){ 
      getSessionFactory().getCurrentSession().getTransaction().rollback(); 
     } 
     finally{ 
      getSessionFactory().close(); 
     } 

alles funktioniert gut, bis ich die gleiche Sitzung bin mit instance.but später, wenn ich die gleichen XML-Datei bin mit dem Ziel PO für bestimmte Attribute aktualisieren es mir die folgenden Fehlermeldung zu geben.

SEVERE: Duplicate entry 'MNLI' for key 'DESTINATIONID' 
9 Jan, 2011 4:58:11 PM org.hibernate.event.def.AbstractFlushingEventListener performExecutions 
SEVERE: Could not synchronize database state with session 
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275) 
    at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:114) 
    at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:109) 
    at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:244) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2242) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2678) 
    at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:79) 

i UUID als Primärschlüssel für die Zieltabelle verwenden und in Zieltabelle habe ich eine Ziel-ID, die ist unique.but ich, dass in dem Fall secodn Hibernate verstehen kann, ist, nicht finden kann, wenn es bereits ein Eintrag für das gleiche Ziel in der Datenbank und versuchen, insert-Anweisung auszuführen, anstatt zu aktualisieren.

Eine mögliche Lösung ist, dass ich Benutzer Destinatid überprüfen kann, ob es bereits ein Ziel inplace mit der angegebenen ID und basierend auf den Ergebnissen kann ich speichern oder aktualisieren Befehl. meine Frage ist, kann dies auf eine andere gute Weise erreicht werden ..?

Vielen Dank im Voraus

+0

Grund für die Sitzung getSessionFactory(). GetCurrentSession() in einer Variablen? – Baz1nga

+0

machst du eine Session.Save() ?? – Baz1nga

+0

@ User350374; mit dieser Methode nur für Testzwecke verwende ich saveOrUpdate() –

Antwort

2

Semantics von saveOrUpdate() Betrieb folgt die (siehe 11.7. Automatic state detection):

  • , wenn das Objekt in dieser Sitzung bereits persistent, nichts
  • tun, wenn ein anderes Objekt zugeordnet sind mit der Sitzung hat die gleiche Kennung, werfen Sie eine Ausnahme
  • , wenn das Objekt keine Bezeichnereigenschaft hat, save() it
  • Wenn der Objektidentifikator den Wert hat, der einem neu instantiierten Objekt zugewiesen ist, save()
  • Wenn das Objekt mit einem oder versioniert wird und der Versionseigenschaftswert dem neu instanziierten Objekt entspricht, speichern Sie() es
  • sonst aktualisieren() das Objekt

So sieht es aus wie Primärschlüssel oder Versionswert wird beim Import von XML-Datei verloren.

+0

ja, da wir XML von Drittpartei-System bekommen so keine Chance, Primärschlüssel zu erhalten und ich weiß wenig über Version Wert ich weiß, dass wir kontrollieren können Ich benutze dies aber nicht sicher, wie dies zu tun ist..auch ich bin schon durch den doc gegangen, aber ich bin immer noch nicht klar, wie mit meinem Fall umzugehen, da ich nicht sicher bin, wann wir zweite XML für die Aktualisierung bekommen. –

+0

@umesh: Wenn Ihr XML keinen Primärschlüssel hat und durch die Ziel-ID identifiziert wird, dann müssen Sie den Primärschlüssel des vorhandenen Objekts mit der gleichen Ziel-ID zuerst ermitteln. – axtavt

+0

Danke, dass ich gerade über einen anderen Weg nachgedacht habe, können wir das mit einem Versionsverwaltungstrick tun, wie ein Zeitstempel, der von der XML von Drittanbietern gesendet wird –

Verwandte Themen