当没有引用它的孩子时,我需要删除它。这在 Hibernate 中可能吗?(实际上我使用的是流利的 nhibernate,但我认为答案是一样的)
例如,我有很多来自不同公司的客户。当我删除公司的最后一个客户时,我也想自动删除公司详细信息。
与正常的亲子关系不同,我不会有意识地选择删除公司。就用户而言,他只是在删除一个客户;删除未引用的公司只是其副产品。
当没有引用它的孩子时,我需要删除它。这在 Hibernate 中可能吗?(实际上我使用的是流利的 nhibernate,但我认为答案是一样的)
例如,我有很多来自不同公司的客户。当我删除公司的最后一个客户时,我也想自动删除公司详细信息。
与正常的亲子关系不同,我不会有意识地选择删除公司。就用户而言,他只是在删除一个客户;删除未引用的公司只是其副产品。
Hibernate 不会为您神奇地做到这一点。你必须自己实现它:
Company company = customer.getCompany();
company.removeCustomer(customer);
session.delete(customer);
if (company.getCustomers().isEmpty()) {
session.delete(company);
}
我不知道通过 NHibernate 映射执行此操作的方法,您可能需要在删除客户逻辑中编写一些逻辑,该逻辑使用公司标识符计算客户表中的记录数,其中客户标识符不是一个被删除,如果结果计数为 0,则删除客户和公司。
伪代码:
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();
}
}
或者,如果不需要立即删除,您可以按计划运行存储过程来“整理”旧公司。