Java, Hibernate, CascadeTypes и «сборщик мусора» Сироты - PullRequest
4 голосов
/ 01 декабря 2011

Какой тип каскада я могу использовать и где, чтобы Hibernate автоматически удалял изображение, когда больше нет «вещей», ссылающихся на него?(в общем-то, сбор мусора в Hibernate)

База данных: Таблица вещей - Таблица изображений, многие к одному, поэтому многие вещи могут ссылаться на одно и то же изображение.

Объекты: вещь,Image

Это много к одному, поэтому, например, 5 вещей имеют отношение к одному изображению.

Прямо сейчас я делаю:

public void delete(Thing thing)
{
    if (countReferences(thing.getImage()) > 1)
    {
        thing.setImage(null);
    }
    getSession().delete(thing);
}

Если я наденуне делайте countReferences, и в отношениях есть CascaseType.REMOVE, Hibernate также пытается удалить изображение.Ограничение в базе данных срабатывает, когда изображение еще где-то ссылается, вызывая исключение.

Итак, вкратце, как я могу сказать hibernate удалить Image, когда последняя вещь, ссылающаяся на него, удалена?

Является ли

org.hibernate.event.PreDeleteEventListener

возможно решением?

1 Ответ

3 голосов
/ 01 декабря 2011

После копания в Hibernate Docs кажется, что такая функция не поддерживается. Хотя я думаю, что понимаю, почему это не поддерживается.

В ссылке one-to-many сущности в коллекции рассматриваются как принадлежащие сущности, содержащей коллекцию (см. 24.1. Примечание о коллекциях ).

В противоположность этому, ссылка many-to-one не имеет таких последствий. Ссылочная сущность, по праву, не принадлежит ссылающейся сущности. Таким образом, даже после удаления всех ссылок на Image нет оснований считать, что Image также следует удалить. Image является полностью независимой сущностью 1-го класса.

Итак, в вашем случае кажется, что нет возможности избежать принудительного принудительного удаления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...