Generate model и целочисленный ID

Студия версии 6.8.5 при генерации модели при указании целочисленной колонки в качестве ключа все равно наследует класс от BaseUuidEntity.
Студия версии 6.9-SNAPSHOT в подобной ситуации вываливает ошибку Parent is null. Если же продолжить сохранение данной сущности, то класс будет создан вообще без указания наследования. Cредствами студии такую сущность даже удалить не возможно.

PS. Студия 6.8.5 только при запуске показывает, что она 6.8.5. После открытия проекта в заголовке окна и в About показывает версию 6.8.4. Только у меня такое поведение?

Здравствуйте,
В Studio 6.9 действительно поменялась логика генерации модели.
В наших тестовых конфигурациях все работает правильно. Поэтому, требуется ряд уточнений:
Для какой DBMS наблюдается проблема с генерацией модели? На мигрируемой таблице имеется PK constraint?
Если возможно прикрепите create-script таблицы.

Вы устанавливали Studio SE 6.8.4 для всех пользователей или “только для данного пользователя”? Во втором случае возможны проблемы с автоапдейтом. Мы это исправили: при обновлении с 6.8.6 на 6.8.7 все должно пройти без проблем

Microsoft SQL Server 2012+

Нет. Это view.

Второй вариант. Только для себя.

Какие имена носят импортируемые таблицы, представления и колонки? Нет ли названий из больших и маленьких букв, с пробелами? Нет ли запрещенных в SQL диалекте имен (order, group итд)?

В Студии 6.9 мы внесли несколько изменений в генератор модели. Попробуйте проимпортировать Вашу БД в последней сборке 6.9.

image

Где же скачать последнюю 6.9? Я так понимаю она пока не анонсирована.

Ростислав, подскажите еще, пожалуйста, как (где) у импортированной сущности посмотреть какой из атрибутов указан в качестве ID, т.е. маппинг на primary key, который я указываю при импорте.

Для Cuba Studio SE 6.9 доступны ночные сборки.

После выбора таблиц для миграции появляется экран с маппингами. Нажав на Edit mapping можно не только посмотреть, как замаппились колонки, но и внести корректировки. Для представлений функция тоже доступна (после того как ПК выбран).
image

1 симпатия

Да, это мне известно. Как узнать ПК после импорта?

Ростислав, еще второй раз замечаю, что в настройке additional data stores слетает database type с Microsoft SQL Server 2012+ на Microsoft SQL Server. Возможно это происходит при переходе с версии 6.9 на 6.8 и обратно. Попробую понаблюдать.

UPD: Да нет, переключение студий здесь не при чем. Ставим Microsoft SQL Server 2012+, импортируем сущность, закрываем проект, открываем проект, видим Microsoft SQL Server.

UPD2: Собственно и по вопросу про ПК. Вижу, что в новой студии класс сгенерирован с новой аннотацией:

@AttributeOverrides({
        @AttributeOverride(name = "id", column = @Column(name = "\"Code\""))
})

Чего ранее не было.

Извиняюсь, если своими обновлениями поста заставляю вас переписывать ответы.

Откройте сущность в IDE. На PK-атрибуте будет стоять аннотация @Id.
В моем случае сгенерированная сущность унаследована от BaseIntIdentityIdEntity. Соответственно, имеется Integer-атрибут с именем “Id”. Открыт родительский класс в IDE:

image

Если сущность StringId, анотацию мы увидим тут же:

image

И Студия показывает системные аттрибуты если они взяты не от базового класса.
image

Что касается версии MSSQL в настройках дополнительного датастора, то все проще. После переоткрытия проекта Студия не знает какая версия DBMS используется в дополнительном датасторе, так как это признак нигде не сохраняется.
Однако, 2005 распознается потому что используется другой драйвер.

Единственная проблема которая может быть: при включении Createable, Updateable, SoftDelete интерфейсов, генерируются скрипты на добавление колонок с типом datetime, а не datetime2 (как положено для 2012+).
Спасибо что сообщили о проблеме. Мы создали тикет.

В том-то и дело, что для ранее сгенерированной сущности нет аннотации @id. Отсюда и мой вопрос.

Сведения
package com.borets.surok.entity;

import javax.persistence.Entity;
import javax.persistence.Table;
import com.haulmont.chile.core.annotations.NamePattern;
import com.haulmont.cuba.core.entity.BaseIntegerIdEntity;
import com.haulmont.cuba.core.global.DesignSupport;
import javax.persistence.Column;

@DesignSupport("{'dbView':true,'imported':true,'unmappedColumns':['ID'],'generateDdl':false}")
@NamePattern("%s (%s)|name,code")
@Table(name = "Contragent")
@Entity(name = "surok$Contragent")
public class Contragent extends BaseIntegerIdEntity {
    private static final long serialVersionUID = 6925581568799351058L;

    @Column(name = "\"Code\"", nullable = false)
    protected Integer code;

    @Column(name = "\"Deleted\"", nullable = false)
    protected Boolean deleted = false;

    @Column(name = "\"Name\"", length = 100)
    protected String name;

    @Column(name = "\"FullName\"", length = 100)
    protected String fullName;

    @Column(name = "INN", length = 20)
    protected String inn;

    @Column(name = "KPP", nullable = false)
    protected Integer kpp;

    @Column(name = "OGRN", nullable = false, length = 13)
    protected String ogrn;

    @Column(name = "OKPO", nullable = false, length = 10)
    protected String okpo;

    @Column(name = "\"LegalAddress\"", length = 150)
    protected String legalAddress;

    @Column(name = "\"PostAddress\"", length = 150)
    protected String postAddress;

    @Column(name = "\"OurCompany\"", length = 100)
    protected String ourCompany;

    @Column(name = "\"CountryName\"", length = 50)
    protected String countryName;

    public void setCode(Integer code) {
        this.code = code;
    }

    public Integer getCode() {
        return code;
    }

    public void setDeleted(Boolean deleted) {
        this.deleted = deleted;
    }

    public Boolean getDeleted() {
        return deleted;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setFullName(String fullName) {
        this.fullName = fullName;
    }

    public String getFullName() {
        return fullName;
    }

    public void setInn(String inn) {
        this.inn = inn;
    }

    public String getInn() {
        return inn;
    }

    public void setKpp(Integer kpp) {
        this.kpp = kpp;
    }

    public Integer getKpp() {
        return kpp;
    }

    public void setOgrn(String ogrn) {
        this.ogrn = ogrn;
    }

    public String getOgrn() {
        return ogrn;
    }

    public void setOkpo(String okpo) {
        this.okpo = okpo;
    }

    public String getOkpo() {
        return okpo;
    }

    public void setLegalAddress(String legalAddress) {
        this.legalAddress = legalAddress;
    }

    public String getLegalAddress() {
        return legalAddress;
    }

    public void setPostAddress(String postAddress) {
        this.postAddress = postAddress;
    }

    public String getPostAddress() {
        return postAddress;
    }

    public void setOurCompany(String ourCompany) {
        this.ourCompany = ourCompany;
    }

    public String getOurCompany() {
        return ourCompany;
    }

    public void setCountryName(String countryName) {
        this.countryName = countryName;
    }

    public String getCountryName() {
        return countryName;
    }

}

Более того, при попытке ее установить компилятор сообщает о множественном ID для сущности.

Найдите PK в родительской сущности BaseIntegerIdEntity.

Что касается генерации BaseUuidEntity вместо BaseInteger- , мы воспроизвели проблему: При обработке представлений, студия не справляется с именами колонок в микс-кейсе (с большими и маленькими буквами).

Чтобы решить проблему:
Если приемлемо - создайте новые представления с директивой “as” (без микс-кейс имен).
Или создайте(исправьте) классы сущностей вручную.

Мы создали тикет и исправим проблему. Спасибо.

1 симпатия

Ростислав, касаемо новой аннотации:

@AttributeOverrides({
        @AttributeOverride(name = "id", column = @Column(name = "\"Code\""))
})

В данном случае ПК теперь отсутствует в списке колонок. Возможно для него задать формат отображения на форме?

Это поле можно добавить и как колонку к таблице, и как поле к FieldGroup. PK всегда включен во view соответственно, есть в датасорсах.

Нет, автогенерируемые экраны это поле не содержат, но его действительно можно добавить.
Вопрос как раз об этот. Сейчас оно отображается в региональном стандарте, например, как 1,125 (целое число). Ранее для колонки я мог задать @NumberFormat для вывода, например, как 1125. Сейчас это возможно?

Если требуется указать @NumberFormat на атрибуте, можно унаследовать класс от более раннего предка (BaseGenericIdEntity вместо BaseLongIdEntity) и указать атрибут с аноттацией @Id. Т.е. как-то так.

@DesignSupport("{'dbView':true,'imported':true}")

@Table(name = "view1")
@Entity(name = "import123$View1")
public class View1 extends BaseGenericIdEntity<Long> {
    private static final long serialVersionUID = -6462643379836192835L;


    @Id
    @NumberFormat(pattern = "#")
    @Column(name = "fldtwo")
    protected Long fldtwo;

    @Override
    public Long getId() {
        return fldtwo;
    }

    @Override
    public void setId(Long fldtwo) {
        this.fldtwo = fldtwo;
    }

    public void setFldtwo(Long fldtwo) {
        this.fldtwo = fldthree;
    }

    public Long getFldtwo() {
        return fldtwo;
    }
1 симпатия