Использование Ebean View `@ View` без дублирования моделей - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь создать представления Ebean для таблиц на основе простого объединения, и у меня возникают проблемы при extend Model для базовой таблицы.

Поля видов и поля моделей абсолютно совпадают.

Моя модель стола выглядит так:

@Entity
@Table(name = "assets")
public class Asset extends EnvironmentModel<Integer> {
    @Id
    @Column
    @PrimaryKey
    @Attribute(index = 0)
    private int assetId;
    @Column
    @Attribute(index = 1)
    private String make;
    etc...
}

Это прекрасно работает.

Теперь то, что я пытаюсь сделать с View:

@View(name = "assets_view")
public class AssetView extends Asset {
}

Я думал, что смогу сделать это, потому что AssetView и Asset имеют одинаковые точные поля.

Когда я делаю это таким образом, я получаю исключение: Caused by: javax.persistence.PersistenceException: models.asset.AssetView is NOT an Entity Bean registered with this server?

Поэтому моей следующей попыткой было добавить аннотацию @Entity в класс View. например,

@Entity
@View(name = "assets_view")
public class AssetView extends Asset {
}

При компиляции я получаю следующее исключение: Error injecting constructor, java.lang.IllegalStateException: Checking class models.asset.AssetView and found class models.asset.Asset that has @Entity annotation rather than MappedSuperclass?

Но я не могу удалить аннотацию @Entity из моего Asset класса, потому что мне это нужно для вставки.

Мои вопросы: Есть ли способ иметь представление и таблицу совместно использовать ту же модель, чтобы я мог запросить из представления и вставить / обновить в таблицу?

1 Ответ

0 голосов
/ 06 сентября 2018

Хорошо, я нашел ответ, и я не знаю, очевидно ли это.

По сути, я просто сделал свой базовый класс @MappedSuperClass например,

@MappedSuperclass
public class _Asset extends EnvironmentModel<Integer> {
    @Id
    @Column
    @PrimaryKey
    @Attribute(index = 0)
    private int assetId;
    @Column
    @Attribute(index = 1)
    private String make;
    etc..
}

Затем я расширил свой Asset стол и AssetView из этого сопоставленного суперкласса, например

@Entity
@Table(name = "assets")
public class Asset extends _Asset {
}

-

@Entity
@View(name = "assets_view")
public class AssetView extends _Asset {
    public static final Model.Find<Integer, AssetView> finder = new Model.Finder<>(AssetView.class);
}
...