我目前正在 Ubuntu 上使用 Play Framework 2.2.2 编写一个新的 Java 项目。我正在尝试建立一个非常简单的类层次结构,该层次结构将允许不同的数据库持久元素从一个公共(public) BaseEntity 类继承公共(public)字段,例如 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()
{
...
}
}
为了进行实验,我创建了一个简单的基类,其中包含一个新属性 name。这编译得很好:
@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 类不包含名称字段或 getset 时,EBean 可以成功将实体保存到数据库。一旦我添加了带有 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 或将它们移动到基类会导致相同的异常。我不知疲倦地在网上寻找一些例子来说明我做错了什么,但还没有找到任何解决办法。我确信这很简单。有人可以帮忙吗?
问候。
最佳答案
这对我有用。我没有使用 getter 或 setter。我在 Play 2.2 上开发了它,现在在 2.3 上运行。为了清楚起见,我删除了大部分字段。可能是因为您将名称字段标记为 protected ?
@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;
..
}
关于mysql - Java 中的 EBean - 使用 @MappedSuperclass 进行继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25610294/