2014-09-01 5 views
2

В настоящее время я пишу новый Java-проект с Play Framework 2.2.2 на Ubuntu. Я пытаюсь создать очень простую иерархию классов, которая позволит различным db-persistable элементам наследовать общие поля, такие как id, created_at, deleted_at и т. Д., Из одного общего класса BaseEntity, чтобы избежать необходимости переписывать одну и ту же плиту котла.EBean в Java - Наследование с помощью @MappedSuperclass

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

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

С уважением.

ответ

2

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

Спасибо, я думаю, это может быть связано с компиляцией проблем - когда я вручную добавил свойства, которые он отсутствовал, например. _ebean_getni_name скомпилировано. Я думаю, что они предназначены для создания автоматически генерируемых свойств, которые по какой-то причине не генерировались должным образом для базового класса. Модификатор доступа не имел никакого значения. Перейдем к более простой и менее проблематичной ORM на данный момент! – mistakenot