Каскадное удаление при связи один к одному

Есть две сущности. Сущность А и сущность Б.

class AEntity {
    @JmixGeneratedValue
    @Column(name = "ID", nullable = false)
    @Id
    private UUID id;

    @NotNull
    @OnDelete(DeletePolicy.CASCADE)
    @Composition
    @OneToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "B_ENTITY_ID", nullable = false)
    private BEntity child;
}

class BEntity {
    @JmixGeneratedValue
    @Column(name = "ID", nullable = false)
    @Id
    private UUID id;

    private String name;
}

При удалении записи из таблицы А не удаляется запись из таблицы Б. В базе данных тоже смотрел внешний ключ таблицы А на Б, нет каскадного удаления. При всех других связях (OneToMany, ManyToOne и ManyToMany) каскадное удаление работает.

Добрый день!

В Java Docs аннотаций @OnDelete и @OnDeleteInverse указывается что они применяются к Soft Delete сущностям. Про данные аннотации можно почитать здесь: Мягкое удаление :: Документация Jmix

Скажите в остальных связях на сущностях использовалась аннотация OnDeleteInverse или OnDelete? Я протестировал на демо проекте с типом композиции, и OnDeleteInverse применялся. Хотя если указать только OnDelete, то каскад не работал, что по идее правильно.

Сейчас сложно сказать, баг это или нет. Тут скорее странно что OnDeleteInverse работает без Soft Delete. Завёл задачу, позже посмотрим что не так: OnDeleteInverse in composition applies despite missing Soft Deletion in both entities · Issue #3536 · jmix-framework/jmix · GitHub

В отношении one-to-one пока лучше убрать OnDelete и указать стандартное JPA cascade:

@OneToOne(fetch = FetchType.LAZY, optional = false, cascade = CascadeType.REMOVE)

В таком случае должно заработать.

Нее. не работает, я так тоже делал, сейчас на всякий случай проверил ещё раз

@OnDelete работает только для мягко-удаляемых сущностей. Добавили описание аннотаций в документацию:

@OnDeleteInverse работает и для обычных сущностей, вызывая создание FK с ON DELETE CASCADE, но в данном случае это бесполезно, так как удаление идет с другой стороны.

CascadeType.REMOVE на атрибуте ссылки должен работать:

@JmixEntity
@Table(name = "ALPHA")
@Entity
public class Alpha {
// ...
    @JoinColumn(name = "BETA_ID")
    @Composition
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
    private Beta beta;

При удалении экземпляра Alpha удаляется и связанный Beta.

Если у вас не работает, приложите тестовый проект в котором это воспроизводится.

С уважением,
Константин