2015-03-07 7 views
5

Vor kurzem begann ich Play Framework 2.3.8 zu verwenden.Update-Methode von Ebean funktioniert nicht in playframework

Allerdings Update des Modells ist ich in Schwierigkeiten ohne gute Arbeit.

Übrigens, speichern Methode funktioniert.

Das Update funktioniert nicht mit Code wie dem folgenden. (Es wird nicht auf die Datenbank beibehalten werden.)

User user = User.findByEmail(email); 
user.remoteAddress = remoteAddress; 
user.userAgent  = userAgent; 
user.latitude  = latitude; 
user.longitude  = longitude; 
user.lastLoginAt = new Date(); 
user.update(); 

jedoch der folgende Code wird wie vorgesehen.

User newUser = new User(); 
newUser.id = user.id; 
newUser.remoteAddress = remoteAddress; 
newUser.userAgent  = userAgent; 
newUser.latitude  = latitude; 
newUser.longitude  = longitude; 
newUser.lastLoginAt = new Date(); 
newUser.update(); 

Warum kann ich die ursprüngliche Instanz nicht aktualisieren?

Benutzerklasse ist wie folgt.

package models.entities; 

import java.util.*; 

import javax.persistence.*; 

import com.avaje.ebean.annotation.*; 

import play.db.ebean.*; 
import play.db.ebean.Model.Finder; 

import play.data.validation.Constraints.*; 

import play.Logger; 

import models.services.*; 

/** 
* @author satouf 
*/ 
@Entity 
@Table(name="user") 
public class User extends Model { 

    @Id 
    public Long id; 

    @Column(nullable = false, columnDefinition = "varchar(32)") 
    public String userIdentifier; 

    @Column(nullable = false, columnDefinition = "varchar(255)") 
    public String loginId; 

    @Column(columnDefinition = "text") 
    public String loginPassword; 

    @Column(columnDefinition = "varchar(64)") 
    public String handleName; 

    @Email 
    @Column(nullable = false, columnDefinition = "varchar(255)") 
    public String email; 

    @Column(nullable = false, columnDefinition = "smallint default 0") 
    public short status; 

    @Column(columnDefinition = "varchar(64)") 
    public String lastRemoteAddress; 

    public String lastUserAgent; 

    public Date lastLoginAt; 

    public double latitude; 

    public double longitude; 

    @UpdatedTimestamp 
    public Date updatedAt; 

    @CreatedTimestamp 
    public Date createdAt; 

    public static Finder<Long, User> finder = new Finder<Long, User>(Long.class, User.class); 

    @Override 
    public String toString(){ 
    return ("[id: " + id + ", userIdentifier: " + userIdentifier +  ",  loginId: " + loginId + ", handleName: " 
     + handleName + ", latitude: " + latitude + ", longitude: " +  longitude + "]"); 
    } 

} 
+0

Was ist die Datenbank-Engine? ist "user" kein reserviertes Wort darin? versuche, '@Table (name =" users ")' anstatt – biesior

+0

zu verwenden Ich benutze mysql.'user 'ist, ich denke, ist kein eingeschränktes Wort In mysql. –

+0

Erhalten Sie einen Fehler nach dem Ausgeben der Funktion 'user.update()'? Oder ist es einfach nur nicht in der Datenbank gespeichert? – jcreason

Antwort

0

Für Objekte aktualisieren fügen Sie die ID als param für update Methode, das heißt:

user.update(user.id); 

für die Erstellung ne Objekte verwenden save() Methode ohne param:

newUser.save(); 
+0

Vielen Dank für die Antwort. Ich wurde wie folgt modifiziert. Benutzer.Update (Benutzer.id); Aber der Fehler ist aufgetreten. In der Benutzerklasse existiert eine öffentliche ID. Die Fehlermeldung unten. Die Aktion konnte nicht aufgerufen werden, und es wurde ein Fehler angezeigt: org.springframework.beans.InvalidPropertyException: Ungültige Eigenschaft 'id' der Bean-Klasse [models.entities.Benutzer]: Keine Eigenschaft 'id' gefunden –

+0

Zeigen Sie uns Ihr Benutzermodell – biesior

+0

Vielen Dank. Ich habe die Frage bearbeitet. –

16

Aus irgendeinem seltsamen Grund Direkter Zugriff auf Mitglieder schlägt für das Ebean-Update fehl.

hinzufügen Setter, zum Beispiel:

private setUserAgent(String val) { 
    this.userAgent = val; 
} 

und rufen:

user.setUserAgent(your_val); 
user.update(); 
+0

Danke antworten. Dieses Problem wurde behoben Nach dem Upgrade auf Version 2.4. –

+2

@Fuyuhiko Satou: Ich benutze Play 2.4.x. Dieses Problem ist noch nicht gelöst. Deshalb brachte mich Google hierher – transang

+0

@ Nissassin17 Dieses Problem scheint oder nicht aufgetreten oder auftreten. In meinem Fall wurde es beim Upgrade zufällig gelöst, bei Linux und Mac kam es nicht vor. (Es tritt nur unter Windows) –

1

sauber tun und neu kompilieren

Dies liegt daran, dass Sie ein Problem mit Bean-Eigenschaft nicht sind, die aktualisiert werden .

1

Führen Sie eine vollständige Neuerstellung durch. Das Problem tritt auf, wenn Sie eine vorhandene Model-Klasse (wie Benutzer) haben und ein neues Feld hinzufügen. Wenn Sie die Kompilierung nicht bereinigen, generiert PlayEnhancer keine Setter/Getter für das neue Feld, daher wird das Update nicht durchgeführt. Eine saubere Kompilierung wird den Trick machen. Weitere Informationen: https://www.playframework.com/documentation/2.6.x/PlayEnhancer