InstanceName и данные из ассоциации

Добрый день!
Есть сущность и поле ассоциация один ко многим.
Требуется в InstanceName выводить поле из сущности в этом поле ассоциации.
Как пример - поле-ассоциация - это тип документа и в InstanceName надо вывести название типа.
Можно ли инжектить dataManager и другие бины в класс описания сущности?
Если нет, то какие еще подходы можно исполльзовать?
Студия не дает этого делать.

Используйте формирования InstanceName метод и используйте для него его аннотацию @DependsOnProperties чтобы обозначить ссылочные атрибуты, которые вам потребуются.
Эти атрибуты будут добавлены в фетч-план для обязательной загрузки.
В документации есть пример: Сущности :: Документация Jmix

1 симпатия

@andrey_vb большое спасибо!
Т.к. в примере только простые атрибуты, поэтому вопрос возник.

Продолжу тему.
В документации написано:

Вы можете указать только непосредственные локальные и ссылочные свойства. Такие пути к свойствам, как customer.name не поддерживаются.

Как быть, если мне требуется вывести свойство ссылочного свойства?

Тогда либо загружать сущность с соответствующим фетч-планом так, чтобы ссылочный атрибут железно загружался.
Либо можно гарантировать загрузку ссылочного атрибута и без создания феч-плана.
Если ваш ссылочный атрибут name сущности Customer в свою очередь тоже прописан в аннотации @DependsOnProperties этой самой сущности Customer или отмечен @InstanceName - он всегда будет загружаться.
Значит вы можете его использовать в методе формирования InstanceName.
Но тут важно не перестараться с такой вложенностью, а загрузка перечней сущностей может идти долго из-за того, что в минимальном фетч-плане подтягивается много атрибутов из ссылочных полей.

Например, сущность, которая будет ссылочной:

@Entity(name = "realcrm_Developer")
public class Developer implements HasIsLock {
    @JmixGeneratedValue
    @Column(name = "ID", nullable = false)
    @Id
    private UUID id;

    //Мы точно знаем, что name всегда загружается с экземпляром Developer 
    @InstanceName
    @Column(name = "NAME", nullable = false)
    @NotNull
    private String name;
....
}

“Основная” сущность в которой в InstanceName нужно подтянуть значение атрибута из ссылочной:

@Entity(name = "realcrm_Building")
public class Building {
    @JmixGeneratedValue
    @Column(name = "ID", nullable = false)
    @Id
    private UUID id;

    @Column(name = "NAME")
    private String name;

    @Column(name = "CITY", nullable = false)
    @NotNull
    private String city;

    @JoinColumn(name = "DEVELOPER_ID")
    @ManyToOne(fetch = FetchType.LAZY)
    private Developer developer;

    @JoinColumn(name = "COMPLEX_ID")
    @ManyToOne(fetch = FetchType.LAZY)
    private Complex complex;
...
...
    @InstanceName
    //Кроме локальных city и name  - требуем загрузить ссылочный атрибут developer
    @DependsOnProperties({"city", "name", "developer"})
    public String getInstanceName() {
        String joinedString = name + "," + city + "(" + developer.getName() ")";
        //developer.name загружен и доступен т.к. он отмечен как InstanceName или прописан
        //в DependsOnProperties сущности Developer
       
        return joinedString;
    }
}

1 симпатия

@andrey_vb спасибо большое.

В зависимости от строения модели и частоты обновлений тех или иных сущностей можно также добавить в сущность Building непосредственный атрибут developerName. Его нужно будет обновлять используя слушатели EntityChangedEvent на Building и на Developer, но это может дать выигрыш в производительности за счет отсутствия JOIN при чтении больших списков.

1 симпатия