Java ebean的更新方法在playframework中不起作用

Java ebean的更新方法在playframework中不起作用,java,ebean,playframework-2.3,Java,Ebean,Playframework 2.3,最近我开始使用Play framework 2.3.8 然而,模型的更新是我在没有工作好麻烦 顺便说一下,save方法是有效的 更新不适用于以下代码。 (它将不会持久化到数据库。) 但是,以下代码将按预期工作 User newUser = new User(); newUser.id = user.id; newUser.remoteAddress = remoteAddress; newUser.userAgent = userAgent; newUser.latitude

最近我开始使用Play framework 2.3.8

然而,模型的更新是我在没有工作好麻烦

顺便说一下,save方法是有效的

更新不适用于以下代码。 (它将不会持久化到数据库。)

但是,以下代码将按预期工作

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();
为什么我不能更新原始实例

用户类如下所示

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 + "]");
  }

}
package models.entities;
导入java.util.*;
导入javax.persistence.*;
导入com.avaje.ebean.annotation.*;
导入play.db.ebean.*;
导入play.db.ebean.Model.Finder;
导入play.data.validation.Constraints.*;
导入play.Logger;
导入模型。服务。*;
/**
*@作者萨图夫
*/
@实体
@表(name=“user”)
公共类用户扩展模型{
@身份证
公共长id;
@列(nullable=false,columnDefinition=“varchar(32)”)
公共字符串用户标识符;
@列(nullable=false,columnDefinition=“varchar(255)”)
公共字符串loginId;
@列(columnDefinition=“text”)
公共字符串登录密码;
@列(columnDefinition=“varchar(64)”)
公共字符串句柄名;
@电子邮件
@列(nullable=false,columnDefinition=“varchar(255)”)
公共字符串电子邮件;
@列(nullable=false,columnDefinition=“smallint默认值0”)
公共短缺状态;
@列(columnDefinition=“varchar(64)”)
公共字符串地址;
公共字符串代理;
最后登录的公共日期;
公共双纬度;
公共双经度;
@更新的时间戳
公共日期更新日期;
@创建时间戳
公共日期创建日期;
公共静态查找器=新查找器(Long.class、User.class);
@凌驾
公共字符串toString(){
return(“[id:+id+”,userIdentifier:+userIdentifier+”,loginId:+loginId+,handleName:”
+handleName+”,纬度:“+纬度+”,经度:“+经度+”]”;
}
}

对于更新对象,将ID添加为
更新
方法的参数,即:

user.update(user.id);
要创建ne对象,请使用不带参数的
save()
方法:

newUser.save();

出于某种奇怪的原因,ebean更新无法直接访问成员

添加设置器,例如:

private setUserAgent(String val) {  
    this.userAgent = val;  
}  
并致电:

user.setUserAgent(your_val);  
user.update();  
进行清理并重新编译

这是因为没有更新bean属性时出现问题。

执行完全重建。 当您有一个现有的模型类(如User)并且添加了一个新字段时,就会出现这个问题。如果不清理编译,PlayEnhancer将不会为新字段生成setter/getter,因此无法执行更新。 一个干净的编译就可以了。
更多信息:

谢谢您的回答。我被修改如下。user.update(user.id);但是,错误已经发生。用户类中存在公共id。下面是错误消息。无法调用该操作,最终出现错误:org.springframework.beans.InvalidPropertyException:bean类[models.entities.User]的无效属性'id':找不到属性'id'显示您的用户模型抱歉,我无法重现您的问题,如果可以,请将其发布到某个地方,即Github上谢谢您的回答。我会再检查一下。嗨,我也有同样的问题。save()方法相应地触发insert()或update()方法。这并没有解决问题。我注意到使用setters解决了问题,而不是像Tamir的回答中描述的那样使用字段访问。最好删除这个建议biesior,除非存在save()和update()方法工作方式不同的情况。仅供参考,谢谢。什么是数据库引擎?
user
不是其中的保留字吗?尝试使用
@Table(name=“users”)
而不是我使用的mysql。“user”是,我认为在mysql中不是一个受限词。在发出
user.update()函数后,是否会出现错误?或者它只是没有持久化到数据库?后者。更新未发生时出错。但它并没有被保存在数据库中。请看这里,谢谢您的回答。升级到2.4版后,这个问题已经解决。@Fuyuhiko Satou:我正在使用Play 2.4.x。这个问题还没有解决。这就是谷歌把我带来的原因here@Nissassin17这个问题似乎没有发生,也没有发生。在我的例子中,它是在升级过程中偶然解决的,在linux和mac中没有出现。(只出现在Windows上)@FuyuhikoSatou:我在用Mac(约塞米蒂)。我的对象是在从直接分配更改为覆盖
getter
@Nissassin17后才被删除的。如果您使用
activator new
创建了另一个应用程序,是否会发生相同的现象?
user.setUserAgent(your_val);  
user.update();