2011-03-23 74 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 {} 

似乎休眠正確地設置表Adeleted = 1,而且會從表B整個條目。當然,我想保留這個條目。

有關於此的任何想法?

我正在使用Hibernate 3.5.5和基於註釋的實體定義。也嘗試過Hibernate 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並不適用。我正在嘗試同樣的事情。對我而言,最後一行仍然被刪除。 – 2017-04-09 04:11:39