Неожиданное поведение при сочетании @ReplaceEntity и InheritanceType.JOINED у замещаемой сущности
Например, с помощью конструктора создаем:
@ReplaceEntity(Category::class)
@DiscriminatorValue("1")
@JmixEntity
@PrimaryKeyJoinColumn(name = "ID", referencedColumnName = "ID")
@Table(name = "EXT_CATEGORY")
@Entity
open class ExtCategory : Category() {
@Column(name = "IS_TABLE")
var isTable: Boolean? = null
}
Ожидаем, что в БД будет:
- dynat_category со всеми своими атрибутами, определенными в io.jmix.dynattr.model.Category
- ext_category c атрибутами id и is_table
Но получаем ext_category с id, is_table и всеми атрибутами dynat_category (как будто реализовалась стратегия InheritanceType.TABLE_PER_CLASS или что-то подобное)
При этом если попытаться создать категорию (экраны dynat_Category.browse, dynat_Category.edit), то при сохранении вылезает ругань на not null констрейнты.
Мы пошли слегка в обход и сделали так:
//@ReplaceEntity(Category::class) //пока не ставим
@DiscriminatorValue("1")
@JmixEntity
@PrimaryKeyJoinColumn(name = "ID", referencedColumnName = "ID")
@Table(name = "EXT_CATEGORY")
@Entity
open class ExtCategory : Category() {
@Column(name = "IS_TABLE")
var isTable: Boolean? = null
}
Создался changelog
<changeSet id="1" author="PgTest">
<createTable tableName="EXT_CATEGORY">
<column name="ID" type="UUID">
<constraints nullable="false" primaryKey="true" primaryKeyName="PK_EXT_CATEGORY"/>
</column>
<column name="IS_TABLE" type="BOOLEAN"/>
</createTable>
</changeSet>
<changeSet id="2" author="PgTest">
<addForeignKeyConstraint baseColumnNames="ID" baseTableName="EXT_CATEGORY"
constraintName="FK_EXT_CATEGORY_ON_ID" referencedColumnNames="ID"
referencedTableName="DYNAT_CATEGORY"/>
</changeSet>
После его применения добавили @ReplaceEntity(Category::class) и все дальнейшие changelog’и про EXT_CATEGORY и DYNAT_CATEGORY игнорировали (он снова пытался добавить в ext_category все поля из category, включая traits)
Тогда все стало работать, как нам было надо.
Возможно, мы изначально что-то стали делать не так и есть какой-то более правильный путь для получения нужного нам результата?