EBean в Java - Наследование с @MappedSuperclass

В настоящее время я пишу новый проект Java с Play Framework 2.2.2 на Ubuntu. Я пытаюсь установить очень простую иерархию классов, которая позволит различным персистентным элементам db наследовать общие поля, такие как id, creation_at, dele_at и т. Д., От одного общего класса BaseEntity, чтобы избежать необходимости перезаписывать одну и ту же таблицу.

Пример, с которым я сейчас работаю, выглядит следующим образом.

@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 может успешно сохранить Entity в базу данных. После того как я добавил поле с геттерами и сеттерами, при попытке сохранить сущность 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-ов или перемещение их в базовый класс приводит к тому же исключению. Я смотрел довольно неутомимо в Интернете примеры, показывающие, что я делаю неправильно, но не нашел ничего, что могло бы это исправить. Я уверен, что это довольно просто. Кто-нибудь может помочь?

С уважением.

1 ответ

Это работает для меня. Я не использую геттеры или сеттеры. Я разработал его на 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;
..
}
Другие вопросы по тегам