EBean nicht tun, updates! es versucht zu tun-Einsätze und scheitern
habe ich eine einfache Benutzer-Modell wie folgt:
package models;
import java.util.*;
import javax.persistence.*;
import play.db.ebean.*;
@Entity
public class User extends Model {
@Id
public Long id;
public String userName;
public String email;
public String workPlace;
public Date birthDate;
@Version
public Long version;
public static Finder<Long,User> find = new Finder<Long,User>(
Long.class, User.class
);
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getWorkPlace() {
return workPlace;
}
public void setWorkPlace(String workPlace) {
this.workPlace = workPlace;
}
public Date getBirthDate() {
return birthDate;
}
public void setBirthDate(Date birthDate) {
this.birthDate = birthDate;
}
public Long getVersion() {
return version;
}
public void setVersion(Long version) {
this.version = version;
}
}
in MySql gibt es bereits einen Datensatz mit der id=1 version=1
erstelle ich ein neues Modell mit der gleichen id+version, ändern Sie den Benutzernamen
dann versuche ich die save () - Methode
schlägt es mit:
javax.persistence.PersistenceException: ERROR executing DML bindLog[] error[Duplicate entry '1' for key 'PRIMARY']
at com.avaje.ebeaninternal.server.persist.dml.DmlBeanPersister.execute(DmlBeanPersister.java:116) ~[ebean.jar:na]
at com.avaje.ebeaninternal.server.persist.dml.DmlBeanPersister.insert(DmlBeanPersister.java:76) ~[ebean.jar:na]
at com.avaje.ebeaninternal.server.persist.DefaultPersistExecute.executeInsertBean(DefaultPersistExecute.java:91) ~[ebean.jar:na]
at com.avaje.ebeaninternal.server.core.PersistRequestBean.executeNow(PersistRequestBean.java:527) ~[ebean.jar:na]
at com.avaje.ebeaninternal.server.core.PersistRequestBean.executeOrQueue(PersistRequestBean.java:557) ~[ebean.jar:na]
at com.avaje.ebeaninternal.server.persist.DefaultPersister.insert(DefaultPersister.java:404) ~[ebean.jar:na]
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '1' for key 'PRIMARY'
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) [na:1.7.0_05]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) [na:1.7.0_05]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) [na:1.7.0_05]
at java.lang.reflect.Constructor.newInstance(Unknown Source) [na:1.7.0_05]
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) ~[mysql-connector-java-5.1.18.jar:na]
at com.mysql.jdbc.Util.getInstance(Util.java:386) ~[mysql-connector-java-5.1.18.jar:na]
was mache ich falsch?
einfügen eines neuen Datensatzes funktioniert. so sieht es bei mir wie einige ebean bug, wo es ist nicht zu erkennen, dass, sollte es ein update. oder ist es eine config, die ich vergessen irgendwo?
Dank
Zeig bitte den code, wo Sie rufen Sie die
warum rufst du nicht
save()
Methode.warum rufst du nicht
update()
InformationsquelleAutor Or Gal | 2012-07-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, es ist im Zusammenhang mit der bytecode-enhancement, dass beide spielen und ebean führt.
Hatte ich seltsame Probleme ähnlich wie bei Ihnen, wenn ich gemischt öffentlich-Felder mit get-und Set-Methoden. Manchmal Werte waren nicht festgelegt, wenn das Feld direkt:
Dies fühlte sich an wie eine potenzielle Todesfalle, so habe ich beschlossen, konsequent zu sein und nur öffentliche Felder. Der Nachteil war, dass ebeans autofetch aufgehört zu arbeiten, aber auf der anderen Seite, zwangen mich zu Stimmen, meine Fragen mit ebean holt.
Dieses hervorragende post von Timo etwas Licht auf, wie ebean und spielen führt Ihre bytecode-Magie.
Ich hatte gerade ein sehr ähnliches Problem, ziemlich seltsames Verhalten. Dies ist der Grund, warum ich Liebe Federn JdbcTemplate seinen alles im offenen. Wirklich geholfen
Joel S, deine Lösung funktionierte für mich.
Vielen Dank! Diese Lösung funktionierte bei mir auch!
InformationsquelleAutor Joel S
Wenn Sie ein selbst erstelltes Objekt, und rufen Sie speichern(), dann Ebean macht eine insert-Anweisung als SQL. Wenn Sie anrufen update() es wird eine update-Anweisung als SQL.
Gibt es keine Logik in Ebean selbst das würde eine zusätzliche Abfrage an die DB nur zu prüfen, wenn es geschieht, um eine Reihe mit ähnlichen Primärschlüssel in der DB, und wenn ja, verwenden Sie eine update-Anweisung, andernfalls ein insert-Anweisung. Das wäre einfach ineffizient sein Verhalten auf seinem Teil, wie in der Regel Sie ' ll wissen, was man zu machen und so nicht ausführen wollen zwei SQL-Anweisungen, nur eine. In diesem Fall kann man tatsächlich sagen, dass ein update, nicht zu versuchen, die Zeile einzufügen wieder auf.
Wenn Sie jedoch Holen Sie das Objekt aus der DB, dann ruft speichern() wird die Verwendung einer update-Anweisung in SQL, da Ebean weiß, sein Zustand ist nicht neu, anstatt bestehende.
Sehen Ebean Dokumentation.
.save()
war inkonsistent (zB. eine Zeit .save() UPDATE, die nächste wird er versuchen, EINFÜGEN), aber vielleicht war ich nur manuell Daten löschen, ohne es zu merken. Wie auch immer, diese Lösung funktioniert einwandfrei! In meinem Fall konnte ich nur testen, um zu sehen, wenn das Einzelteil hat eineid
- Eigenschaft festgelegt ist, und wenn es das tut, ich weiß, dass es vor-vorhanden ist, so kann ich rufen Sie.update()
, sonst rufe ich.save()
. Das spart mir ein DB-Aufruf.Hmmm. Fragen wie diese machen EBean schrecklich zu verwenden mit Scala/Play.
So würden Sie eher Ebean haben zusätzliche SQL-Abfragen, nur um herauszufinden, ob insert oder update auf eine
save()
? Das wäre einfach nur eine schlechte Leistung.das ist nicht das, was ich meinte. Was ich versuche zu erreichen ist ziemlich einfach unidirektional –
@OneToOne
mit Ebean die scheitert, weil cascading versucht zu re-legen Sie die gleiche ID für das untergeordnete Zeile und die Ergebnisse in eine SQL-Ausnahme. Ich habe verschwendet einen ganzen Tag.Das nur stellt sich die Frage, warum verwenden Sie cascade in den ersten Platz, aber die Kommentare sind wirklich nicht der Ort für eine längere Diskussion, dass ist off-topic für diese Frage.
InformationsquelleAutor t0mppa