Удаление объекта в Hibernate / JPA и обнуление дочерних элементов автоматически - PullRequest
1 голос
/ 03 апреля 2012

Можно ли с помощью JPA автоматически аннулировать дочерние элементы при удалении родителя? У меня есть устройство класса модели со статистикой синхронизации. Когда я удаляю устройство, я все еще хочу сохранить статистику, поэтому установите для полевого устройства в классе Statistics значение 'null'.

@OneToMany (mappedBy = "device", fetch= FetchType.LAZY)
public List<Statistic> syncStats;

и

@ManyToOne (fetch= FetchType.LAZY)
public Device device;

Существует ли автоматический способ получения этого эффекта или мне нужно делать это вручную?

В настоящее время я использую:

@PreRemove
protected void removeLinkToStats() {
    syncStats.clear();
}

, но это все равно дает "исключение javax.persistence.PersistenceException, org.hibernate.exception.ConstraintViolationException: Не удалось выполнить пакетное обновление JDBC"

1 Ответ

0 голосов
/ 06 июня 2012

Можно ли с помощью JPA автоматически аннулировать дочерние элементы при удалении родителя?

Нет. С JPA ответственность за синхронизацию лежит на приложении. Ваше приложение должно вызвать бизнес-логику перед удалением объекта с использованием JPA.

Конечно, есть несколько способов сделать это. Используя аннотации, такие как PreRemove или PreDestroy или (мой личный фаворит), выполняйте предварительные операции удаления в бизнес-контейнере, который вызывает доступ к данным для удаления объекта из базы данных.

Краткий пример:

class Business
{
    DataAccess dataAccess;
    //.....

    public void removeEntity(Entity e)
    {
        //do pre removal here
        dataAccess.remove(e);
    }
    //......
}

class DataAccess
{
    EntityManager em;

    //......

    public void remove(Entity e)
    {
        em.remove(e);
    }

    //....
}
...