Hibernate:删除子节点未引用的父节点

时间:2012-04-16 11:02:41

标签: hibernate nhibernate orm fluent-nhibernate

当没有引用父项的子项时,我需要删除父项。这可能在Hibernate中吗? (实际上我正在使用流利的nhibernate,但我认为答案是相同的)

e.g。我有很多来自不同公司的客户。当我删除公司的最后一个客户时,我也想自动删除公司的详细信息。

与正常的亲子关系不同,我不会有意识地选择删除公司。就用户而言,他只是删除了一个客户;删除未引用的公司只是其中的副产品。

2 个答案:

答案 0 :(得分:5)

Hibernate不会为你神奇地做到这一点。你必须自己实现它:

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

答案 1 :(得分:0)

我不知道通过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();
    }
}

或者,如果删除不需要立即进行,您可以按计划运行存储过程以“整理”旧公司。