休眠:删除父不被孩子

问题描述:

我需要删除父时,有没有孩子引用它的引用。这在Hibernate中可能吗? (其实我使用功能NHibernate但我相信答案是一样的)休眠:删除父不被孩子

例如我有许多来自不同公司的客户。当我删除公司的最后一位客户时,我也想自动删除公司的详细信息。

与普通的父子关系,我不自觉地选择要删除的公司。就用户而言,他只是删除了一位顾客;删除一家未提及的公司只是这个的副产品。

Hibernate不会为你做它神奇。你必须自己实现:

Company company = customer.getCompany(); 
company.removeCustomer(customer); 
session.delete(customer); 
if (company.getCustomers().isEmpty()) { 
    session.delete(company); 
} 
+0

@Andy:另外,“Company”可以有其他链接,例如“Building”。如果你想删除“公司”,你也应该手动分解这些链接。 – 2012-04-16 11:13:02

我不知道的方式通过NHibernate的映射,要做到这一点,你可能需要写在你删除客户逻辑一些逻辑,计数的记录数在具有公司标识符的客户表中,客户标识符不是要删除的标识符,如果结果数为0,则删除客户和公司。

psudo代码:

public void Delete(Customer customer) 
{ 
    using (var transaction = session.BeginTransaction()) 
    { 
     int remainingCustomers = 
      session.Query<Customer>(c => c.CompanyId == customer.CompanyId && c.CustomerId != customer.CustomerId).Count(); 

     session.Delete(customer); 

     if (remainingCustomers == 0) 
     { 
      session.Delete(customer.Company); 
     } 

     transaction.Commit(); 
    } 
} 

或者,如果删除不需要立即发生,你可以在一个时间表,“收拾”老企业运行存储过程。