Cannot get unfetched attribute [employeeType] from detached object

Ситуация такая: у меня есть роль hr-role у которой есть политика уровня строк, доступ к обновлению объекта employee только если EmployeeType.SUBCONTRACTOR_LEGAL_ENTITY, при переходе на эту страницу из приложения всё работает нормально, но при переходе по ссылке возникает ошибка Cannot get unfetched attribute [employeeType] from detached, буду очень благодарен помощи

Версия Jmix 1.4.3

@PredicateRowLevelPolicy(entityClass = Employee::class, actions = [RowLevelPolicyAction.UPDATE])
fun employeePredicate(): RowLevelBiPredicate<Employee, ApplicationContext> {
return RowLevelBiPredicate { employee, applicationContext →
employee.getEmployeeType() != EmployeeType.SUBCONTRACTOR_LEGAL_ENTITY
}
}

Вы уверены что проблема в роли? Мб то-же самое что и здесь?

Не уверен, но проблема возникает именно с той ролью, где есть эта политика уровня строк. Пробовал делать как здесь, не работает.

Переделал вот так:

@PredicateRowLevelPolicy(entityClass = Employee::class, actions = [RowLevelPolicyAction.UPDATE])
fun employeePredicate(dataManager: DataManager): RowLevelBiPredicate<Employee, ApplicationContext> {
return RowLevelBiPredicate { employee, applicationContext →
val fetchPlan = “employee-fetch-plan”
val loadedEmployee = dataManager.load(Employee::class.java)
.id(employee.id)
.fetchPlan(fetchPlan)
.one()
loadedEmployee.getEmployeeType() != EmployeeType.SUBCONTRACTOR_LEGAL_ENTITY
}
}

по ссылке переходит, но при изменении полей в сущности, изменения не сохраняются.
Пробовал в методе onAfterShow с помощью dataManager доставать сущность, ошибка не пропадает

Хм… тогда пока-что сложно сказать что не так. Можете сделать тестовый проект?
И полный stacktrace скинуть.

employeePredicate(dataManager: DataManager) - dataManager скорее должен браться из applicationContext. Судя по коду PredicateRowLevelPolicyExtractor он канечно должен ставится но в лог должен warn падать)

На всякий случай уточню. Как я вижу вы работаете с Котлином. У вас другие политки работают? Ибо есть такая проблема

Так а разве так и не должно быть? Или это распространяется на все Employee? а не только EmployeeType.SUBCONTRACTOR_LEGAL_ENTITY

Остальные политики работают, ну или пока не выявил ошибок.

распространяется на все

Еще в stacktrace указывает сюда :
fun getEmployeeType(): EmployeeType? =
employeeType
?.let { EmployeeType.fromId(it) }

@Column(name = “EMPLOYEE_TYPE”, nullable = false)
@NotNull
private var employeeType: String? = null

Но сам EmployeeType это enum:
enum class EmployeeType(private val id: String) : EnumClass {
SIBERIAN_EMPLOYEE(“A”),
SUBCONTRACTOR_INDIVIDUAL(“B”),
SUBCONTRACTOR_LEGAL_ENTITY(“C”);

override fun getId() = id

companion object {

    @JvmStatic
    fun fromId(id: String): EmployeeType? = EmployeeType.values().find { it.id == id }
}

}
Новый текстовый документ (2).txt (54.2 КБ)

Так а employeeType в fetch-plan присутствует?

Да, он там по дефолту

Так… а в экране есть <dataLoadCoordinator auto="true"/>?

Есть.

Хм… тогда даже не знаю куда еще копать… Вы не можете тестовое приложение сделать?