5 Stimmen

Winterschlaf: sql-delete mit inheritace überschreiben

Ich habe eine Entität A y B extends A und versuchen, ein sanftes Löschen mit einer gemeinsamen Vererbungsstrategie zu erreichen.

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

    @Id long id;
    boolean deleted;
}

@Entity
B extends A {}

Es scheint, dass Hibernate die Tabelle richtig setzt A a deleted = 1 , sondern löscht auch den gesamten Eintrag aus der Tabelle B . Ich würde diesen Eintrag natürlich gerne bewahren.

Irgendwelche Ideen dazu?

Ich verwende Hibernate 3.5.5 und annotationsbasierte Entitätsdefinition. Habe auch Hibernate 3.6.2 ausprobiert.

6voto

slipset Punkte 2860

Sie würden einen DeleteEventListener als solchen erstellen wollen:

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

}

wie folgt in Ihre persistence.xml einbinden

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

Vergessen Sie auch nicht, Ihre Kaskaden in Ihren Anmerkungen zu aktualisieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X