【问题标题】:Update method of ebean does not work in playframeworkebean的更新方法在playframework中不起作用
【发布时间】:2015-05-09 01:41:32
【问题描述】:

最近开始使用 Play framework 2.3.8。

但是模型的更新是我在没有工作的情况下遇到了麻烦。

顺便说一句,save 方法有效。

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

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

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

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

}

【问题讨论】:

  • 什么是数据库引擎? user 不是保留字吗?尝试改用@Table(name="users")
  • 我用的是mysql。'user'是,我觉得不是mysql中的限制字。
  • 发出user.update()函数后是否出现错误?还是只是没有持久化到数据库中?
  • 后者。未发生更新时出错。但它没有持久化在数据库中。

标签: java ebean playframework-2.3


【解决方案1】:

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

user.update(user.id);

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

newUser.save();

【讨论】:

  • 感谢您的回答。我修改如下。 user.update(user.id);但是,错误发生了。 User 类中存在公共 id。下面的错误信息。无法调用该操作,最终出现错误:org.springframework.beans.InvalidPropertyException: bean 类 [models.entities.User] 的无效属性 'id': No property 'id' found
  • 向我们展示您的用户模型
  • 对不起,我无法重现您的问题,如果可以,请在某个地方发布它,即在 github 上
  • 感谢您的回答。我会尝试再检查一下。
  • 嗨,我遇到了同样的问题。 save() 方法相应地触发 insert() 或 update() 方法。这并没有解决问题。我注意到使用 setter 修复问题,而不是字段访问,如 Tamir 的回答中所述。最好删除此建议 biesior,除非您有 save() 和 update() 方法的工作方式不同的情况。仅供参考,谢谢。
【解决方案2】:

由于某些奇怪的原因,直接访问成员无法进行 ebean 更新。

添加setter,例如:

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

然后调用:

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

【讨论】:

  • 谢谢你的回答。升级到2.4版本后,此问题已解决。
  • @Fuyuhiko Satou:我使用的是 Play 2.4.x。这个问题还没有解决。这就是谷歌把我带到这里的原因
  • @Nissassin17 这个问题似乎或没有发生或发生过。在我的情况下,它是在升级中偶然解决的,它没有出现在 linux 和 mac。 (仅在 Windows 上发生)
  • @FuyuhikoSatou:我使用的是 Mac(优胜美地)。仅在从直接分配更改为覆盖 getter 后,我的对象才被更新。
  • @Nissassin17 如果您使用activator new进行了其他申请,是否会出现同样的现象?
【解决方案3】:

清理并重新编译

这是因为您遇到了 bean 属性未更新的问题。

【讨论】:

    【解决方案4】:

    执行完全重建。 当您有一个现有的模型类(如用户)并添加一个新字段时,就会出现此问题。如果您不进行干净编译,PlayEnhancer 将不会为新字段生成 setter/getter,因此无法进行更新。 一个干净的编译就可以了。 更多信息:https://www.playframework.com/documentation/2.6.x/PlayEnhancer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-22
      • 2016-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多