休眠:删除父不被孩子
问题描述:
我需要删除父时,有没有孩子引用它的引用。这在Hibernate中可能吗? (其实我使用功能NHibernate但我相信答案是一样的)休眠:删除父不被孩子
例如我有许多来自不同公司的客户。当我删除公司的最后一位客户时,我也想自动删除公司的详细信息。
与普通的父子关系,我不自觉地选择要删除的公司。就用户而言,他只是删除了一位顾客;删除一家未提及的公司只是这个的副产品。
答
Hibernate不会为你做它神奇。你必须自己实现:
Company company = customer.getCompany();
company.removeCustomer(customer);
session.delete(customer);
if (company.getCustomers().isEmpty()) {
session.delete(company);
}
答
我不知道的方式通过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();
}
}
或者,如果删除不需要立即发生,你可以在一个时间表,“收拾”老企业运行存储过程。
@Andy:另外,“Company”可以有其他链接,例如“Building”。如果你想删除“公司”,你也应该手动分解这些链接。 – 2012-04-16 11:13:02