2

我目前正在 Ubuntu 上使用 Play Framework 2.2.2 编写一个新的 Java 项目。我正在尝试建立一个非常简单的类层次结构,它允许不同的 db-persistable 元素从一个公共 BaseEntity 类继承公共字段,例如 id、created_at、deleted_at 等,以避免重写相同的样板。

我目前正在使用的示例如下所示。

@Entity
public class User extends BaseEntity {

   @Id
   public int id;

   @Constraints.Required
   public String email;

   @Constraints.Required
   public IUser.Status status;

   public String activationCode;

   public User()
   {
    ...
   }
}

为了进行实验,我创建了一个简单的基类,其中包含一个新属性名称。这编译得很好:

@MappedSuperclass
public abstract class BaseEntity extends Model {

  protected String name;

  public String getName()
  {
    return this.name;
  }
  public void setName(String value)
  {
    this.name = value;
  }

  public BaseEntity()
  {

  }
}

现在,当 BaseEntity 类不包含 name 字段或 getset-ers 时,EBean 可以成功地将 Entity 保存到 db。一旦我添加了带有 getter 和 setter 的字段,在尝试保存实体时 Play 崩溃并出现以下异常:

java.lang.NoSuchMethodError:models.User._ebean_getni_name()Ljava/lang/String; 在models.User._ebean_getField(User.java:1) 在com.avaje.ebeaninternal.server.reflect.EnhanceBeanReflect$Getter.get(EnhanceBeanReflect.java:162) .....

删除 getset-ers 或将它们移动到基类会导致相同的异常。我已经在网上不知疲倦地寻找显示我做错了什么的例子,但还没有找到任何可以修复它的东西。我敢肯定这很简单。任何人都可以帮忙吗?

问候。

4

1 回答 1

2

这对我有用。我没有使用 getter 或 setter。我在 Play 2.2 上开发它,现在它在 2.3 上运行。为了清楚起见,我删除了大多数字段。可能是因为您将名称字段标记为受保护?

@MappedSuperclass
public abstract class Member extends Model {

    @Id
    public Long id;
    public String businessName;
    public String webAddress;
..
}

@Entity
public class Supplier extends Member {

    public int minimumNoticeInHours;
    public int maximumNoticeInDays;
..
}
于 2014-09-03T15:48:44.920 回答