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
Danke, änderte es aber das scheint nicht das Problem zu beheben –
Könnten Sie auch versuchen, 'Beispiel ex = getById (ex.id); ' Nach: ' Transaktion tx session.beginTransaction() =; ' – KuroObi
gleiche Problem, versucht das Objekt nach trabsaction beginnen immer –