2011-03-23 2 views
4

엔티티가 AB extends A이고 결합 된 상속 전략을 사용하여 소프트 삭제를 시도합니다.최대 절전 모드 : 상속을 사용하여 sql-delete 덮어 쓰기

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

    @Id long id; 
    boolean deleted; 
} 

@Entity 
B extends A {} 

Hibernate가 제대로 테이블 deleted = 1-A를 설정하는 것 같다뿐만 아니라 테이블 B에서 전체 항목을 삭제합니다. 물론이 입장을 보존하고 싶습니다.

그것에 대한 아이디어가 있습니까?

나는 Hibernate 3.5.5와 주석 기반 엔티티 정의를 사용하고있다. 최대 절전 모드 3.6.2도 시도했다.

답변

5

당신은 같은 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"/> 

처럼, 당신의 폭포를 업데이트하는 것을 잊지 마십시오 주석.

+1

이것은 잘 읽지 만, Hibernate 5.1을 사용하면 나에게 적합하지 않다. 나는 똑같은 것을 시도하고있다. 나를 위해 행은 결국 삭제됩니다. –