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;
..
}