2017-04-03 3 views
1

Ich habe folgende EntityHibernate bestehen nicht alle Felder eines Objekts

@Entity 
@Table(name = "Example") 
@JsonIgnoreProperties(ignoreUnknown = true) 
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) 


public class Example implements Comparable<Example>, Serializable { 


    private static final long serialVersionUID = 1L; 
    @JsonProperty 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    long id; 

    String fieldToPersist; 
} 

Seine DAO

public class ExampleDAO { 



    public SessionFactory sessionFactory; 
    public Session session; 

    public ExampleDAO(SessionFactory sessionFactory) { 
     this.sessionFactory = sessionFactory; 
     this.session = sessionFactory.openSession(); 
    } 


    @Transactional 
    public void createOrSave(Example ex) { 
     Session session = sessionFactory.openSession(); 
     Transaction tx = session.beginTransaction(); 
     Example exExisting = getById(ex.id); 
     try { 
      if (exExisting != null) { 
       session.merge(ex); 
       tx.commit(); 
      } else { 
       session.save(ex); 
      } 
     } catch (RuntimeException e) { 
      tx.rollback(); 
     } finally { 
      session.close(); 
     } 

    } 

In meinem Code

Ich habe

example.setFieldToPersist("abc") 
dao.createOrsave(example); 

Für aus irgendeinem grund besteht dies nicht in der da Tabase. Ich sehe den Aufruf an die DAO-Methode und ich sehe keine Fehler in den Protokollen. Aber dieses Feld ist nicht in der Datenbank gespeichert (obwohl das Objekt gespeichert ist)

Ich glaube, es gibt ein Problem mit dem session.merge() Aufruf. Wenn ich es entferne, so dass es nur das Objekt speichert, erstellt es eine neue Zeile für das Objekt, aber die neuen Felder werden gespeichert. Gibt es etwas, das mir fehlt?

Ich bemerkte auch, dass das erste Mal, wenn ich eine Änderung an dem Objekt und rufen Sie die createOrSave() -Methode, es das Objekt korrekt aktualisiert. Aber zukünftige Aufrufe an diese Methode scheinen es nicht zu aktualisieren? Wird die Sitzung alt? Sollten die Protokolle dazu einige Informationen geben?

Ich habe auch den Wert des Feldes kurz vor dem Aufruf zu mergen und es ist der neue Wert. Warum spiegelt sich das nicht in der Datenbank wider?

Ich habe auch versucht die follwoing Methoden anstelle von Merge

session.save() -- creates a new entry in the database with the updated values 
session.update() - no change 
session.saveOrUpdate() -- no change 
session.flush() -- no change 

Antwort

0

Versuchen Sie createOrSave Methode so etwas wie dies zu ändern:

@Transactional 
public void createOrSave(Example ex) { 

    Session session = sessionFactory.openSession(); 
    Transaction tx = session.beginTransaction(); 
    //saving the getById on another variable 
    Example managedExample = getById(ex.id); 

    try { 
     if (managedExample != null) { 
      //if the entity exists, just merge 
      session.merge(ex); 

     } else { 
      session.save(ex); 
     } 
     tx.commit(); 
    } catch (RuntimeException e) { 
     tx.rollback(); 
    } finally { 
     session.close(); 
    } 

} 
+0

Danke, änderte es aber das scheint nicht das Problem zu beheben –

+0

Könnten Sie auch versuchen, 'Beispiel ex = getById (ex.id); ' Nach: ' Transaktion tx session.beginTransaction() =; ' – KuroObi

+0

gleiche Problem, versucht das Objekt nach trabsaction beginnen immer –

Verwandte Themen