Добрый день!
Есть сущность и поле ассоциация один ко многим.
Требуется в InstanceName выводить поле из сущности в этом поле ассоциации.
Как пример - поле-ассоциация - это тип документа и в InstanceName надо вывести название типа.
Можно ли инжектить dataManager и другие бины в класс описания сущности?
Если нет, то какие еще подходы можно исполльзовать?
Студия не дает этого делать.
Используйте формирования InstanceName метод и используйте для него его аннотацию @DependsOnProperties чтобы обозначить ссылочные атрибуты, которые вам потребуются.
Эти атрибуты будут добавлены в фетч-план для обязательной загрузки.
В документации есть пример: Сущности :: Документация Jmix
Продолжу тему.
В документации написано:
Вы можете указать только непосредственные локальные и ссылочные свойства. Такие пути к свойствам, как
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;
}
}
В зависимости от строения модели и частоты обновлений тех или иных сущностей можно также добавить в сущность Building
непосредственный атрибут developerName
. Его нужно будет обновлять используя слушатели EntityChangedEvent на Building
и на Developer
, но это может дать выигрыш в производительности за счет отсутствия JOIN при чтении больших списков.