2012-04-03 2 views
1

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

@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 пакетное обновление"

+0

Вы не можете получить доступ/изменить другие Entites в методах LifeCycle обратного вызова (это в спецификации JPA), поэтому вы получаете исключение. Что произойдет, если вы просто ничего не сделаете об этом, кроме использования orphanRemoval = false? – esej

+0

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

+0

Ну, похоже, что работает. Если вы хотите предложить это как ответ, то я принимаю его за указание на меня в направлении: @PreRemove public void testing() { (Статистический stat: syncStats) { stat.device = null; stat.save(); } } –

ответ

0

Is it possible with JPA to automatically nullify children when deleting the parent?

№ С 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); 
    } 

    //.... 
}