Hibernate: перезаписать sql-delete с наследованием - PullRequest
4 голосов
/ 23 марта 2011

У меня есть сущность A и B extends A, и я пытаюсь выполнить мягкое удаление со стратегией объединенного наследования.

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@SQLDelete("UPDATE A SET deleted = 1 WHERE id = ?")
A {

    @Id long id;
    boolean deleted;
}

@Entity
B extends A {}

Кажется, что Hibernate правильно устанавливает таблицу A на deleted = 1, но также удаляет всю запись из таблицы B. Я, конечно, хотел бы сохранить эту запись.

Есть идеи на этот счет?

Я использую Hibernate 3.5.5 и определение сущностей на основе аннотаций. Пробовал Hibernate 3.6.2.

1 Ответ

5 голосов
/ 11 мая 2012

Вы хотите создать DeleteEventListener следующим образом:

public class SoftDeleteEventListener extends DefaultDeleteEventListener {

private static final long serialVersionUID = 1L;

@Override
public void onDelete(DeleteEvent event, Set arg1) throws HibernateException {
    Object o = event.getObject();
    if (o instanceof SoftDeletable) {
        ((SoftDeletable)o).setStatusId(1);
        EntityPersister persister = event.getSession().getEntityPersister( event.getEntityName(), o);
        EntityEntry entityEntry = event.getSession().getPersistenceContext().getEntry(o);
        cascadeBeforeDelete(event.getSession(), persister, o, entityEntry, arg1);

        cascadeAfterDelete(event.getSession(), persister, o, arg1);

    } else {
        super.onDelete(event, arg1);
    }
}

}

подключите его к вашему persistence.xml вот так

<property name = "hibernate.ejb.event.delete" value = "org.something.SoftDeleteEventListener"/> 

Также не забудьте обновитькаскады в ваших аннотациях.

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