Frage

Ich habe 2 EJB 3 Entity Beans:

@Entity
public class Organisation
{
    @Id
    @Column(length = 64)
    private String guid;

    private String name;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
    @JoinColumn(name = "home_unit_fk", nullable = true)
    private Unit homeUnit;          
}

@Entity
public class Unit
{
    @Id
    @Column(length = 64)
    private String guid;

    private String name;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "organisation_fk", nullable = false)
    private Organisation organisation;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "parent_unit_fk", nullable = true)
    private Unit parentUnit;

    @OneToMany(mappedBy = "parentUnit", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
    @OrderBy("shortName")
    @OptimisticLock(excluded = true)
    private Set<Unit> childUnits;   
}

Wenn ich lösche eine über die Organisation unter Verwendung von Standard Dao:

public int deleteByGuid(final String guid) 
{
    final Query query = entityManager.createQuery("delete from " + getPersistentClass().getName() + " where guid = :guid");
    query.setParameter("guid", guid);
    return query.executeUpdate();
}

Aber ich bekomme die folgende Ausnahme:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Kann nicht löschen oder eine übergeordnete Zeile aktualisieren: ein Fremdschlüssel fehlschlägt (config.unit, CONSTRAINT FK27D184F5D4393D FOREIGN KEY (organisation_fk) LITERATUR organisation (guid))

Ich bekomme es nicht. Was mache ich falsch? Sollte nicht JPA / Hibernate Löschungen führt sowohl auf die Einheit und die Organisation innerhalb derselben Transaktion?

War es hilfreich?

Lösung

Eine Masse löscht Abfrage nicht geladen Objekte in dem Speicher und es umgeht jede Kaskade auf Vereinigungen festgelegt.

Ich würde codiert Ihre Löschmethode wie:

public int deleteByGuid(final String guid){
    Organization org = entityManager.find(Organization.class, guid);
    entityManager.remove(org);
}

Wenn Sie eine Abfrage verwenden Bulk-Updates zu tun, wird der Vorgang in der Datenbank direkt übertragen. Wenn Sie untergeordnete Objekte löschen möchten, müssen Sie in der „Datenbank“ Ebene eine DELETE CASCADE Trigger gesetzt.

durch das Objekt zu laden und zu entfernen es, den Ruhezustand wird die Kaskade in dem „Objekt“ -Niveau triggern.

Weitere Informationen finden Sie unter: http://twasink.net/blog/2005/04/differences-in-behaviour-between-hibernate-delete-queries-and-the-old-way/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top