문제

나는 2 개의 EJB 3 엔티티 콩이 있습니다.

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

표준 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();
}

그러나 나는 다음과 같은 예외를 얻습니다.

com.mysql.jdbc.exceptions.jdbc4.mysqlintegrityconstraintViolationException : 상위 행을 삭제하거나 업데이트 할 수 없습니다 : 외래 키 제약 조건이 실패합니다 (config.unit, 제약 FK27D184F5D4393D 외국 키 (organisation_fk) 참조 organisation (guid))

나는 그것을 얻지 못한다. 내가 뭘 잘못하고 있죠? JPA/Hibernate가 동일한 거래 내에서 장치와 조직 모두에서 삭제를 수행해서는 안됩니까?

도움이 되었습니까?

해결책

벌크 삭제 쿼리는 객체를 메모리에로드하지 않으며 연결에 지정된 캐스케이드를 우회합니다.

나는 당신의 삭제 방법을 다음과 같이 코딩합니다.

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

쿼리를 사용하여 대량 업데이트를 수행하면 작업이 데이터베이스에 직접 위임됩니다. 자식 객체를 삭제하려면 "데이터베이스"레벨에서 삭제 캐스케이드 트리거를 설정해야합니다.

객체를로드하고 제거함으로써 최대 절전 모드는 "개체"레벨에서 캐스케이드를 트리거합니다.

추가 정보 : http://twasink.net/blog/2005/04/differences-in-behaviour-between-hibernate-delete-queries-and-the-gold-way/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top