我有两个实体上定义了许多一对多的关系。许多一对多和HQL批量删除
<set name="TreasuryCodes" table="ServiceProviderAccountTreasuryCode" lazy="true" cascade="all">
<key column="ServiceProviderAccountId" />
<many-to-many column="TreasuryCodeId" class="TreasuryCode" />
</set>
<set name="ServiceProviderAccounts" table="ServiceProviderAccountTreasuryCode" lazy="true" inverse="true" cascade="all">
<key column="TreasuryCodeId" />
<many-to-many column="ServiceProviderAccountId" class="ServiceProviderAccount" />
</set>
现在我想通过ServiceProviderId删除所有ServiceProviderAccounts。我写这篇文章的代码:
public void DeleteAllAccount(int serviceProviderId)
{
const string query = "delete ServiceProviderAccount spa where spa.ServiceProvider.Id = :serviceProviderId";
repository.Session.CreateQuery(query)
.SetInt32("serviceProviderId", serviceProviderId)
.ExecuteUpdate();
repository.Session.Flush();
}
,我收到此异常:
Test method Test.ServiceRepositoryTest.DeleteAllAccountTest threw exception:
NHibernate.Exceptions.GenericADOException: could not execute update query[SQL: delete from ServiceProviderAccount where ServiceProviderId=?] ---> System.Data.SqlClient.SqlException: The DELETE statement conflicted with the REFERENCE constraint "FKBC88A84CB684BF79". The conflict occurred in database "Test", table "dbo.ServiceProviderAccountTreasuryCode", column 'ServiceProviderAccountId'.
The statement has been terminated.
我很困惑,因为我已经对实体定义的级联,不应NHibernate的从ServiceProviderAccountTreasuryCode删除行?
UPDATE
OK,貌似executeUpdate的不是找NHibernate的级联反应,可能是因为它没有删除之前加载实体?反正是有任何其他方式从ServiceProviderAccountTreasuryCode表,然后通过HQL从ServiceProviderAccounts删除?我知道我可以在数据库上使用级联,但我想避免这种情况。我要的是HQL删除许多-to-many关联表行。可能吗?或者我应该使用普通的SQL?
是的,我做了一些研究,看起来像你的解决方案是唯一的。谢谢 – Davita 2011-02-27 08:49:07