我试图通过nHibernate将父对象及其子节点保存到SQL Server数据库。 这两个对象的DB中的结构如下: 父(应用程序)表的主键是' Id'这是子(application_certificate)表的外键,它也被称为“id'”。 此外,子表格中包含“' Id'作为复合主键以及另一列。 如果我创建并保存应用程序,我没有例外。但是,如果我尝试将证书与其关联,则会出现以下异常:
行被另一个事务更新或删除(或未保存的值映射不正确):[Order.ApplicationCertificate#Order.ApplicationCertificate]
hbm.xml文件(仅包含相关部分)如下:
Application.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping assembly="sApp" namespace="Order" xmlns="urn:nhibernate-mapping-2.2">
<class name="Application" table="application" lazy="false" dynamic-insert="true" >
<id name="Id" column="id" />
<bag name="ApplicationCertificates" inverse="false" cascade="all-delete-orphan" lazy="true">
<key column="id" />
<one-to-many class="ApplicationCertificate" />
</bag>
</class>
</hibernate-mapping>
application_certificate.hbm.xml:
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping assembly="sApp" namespace="Order" xmlns="urn:nhibernate-mapping-2.2">
<class name="ApplicationCertificate" table="application_certificate" lazy="false" dynamic-insert="true" optimistic-lock="version" dynamic-update="true">
<!--optimistic-lock="version"-->
<composite-id>
<key-property name="Id" column="id" />
<key-property name="CertificateNumber" column="certificate_number" />
</composite-id>
<!-- must be first element after id-->
<version column="version" name="Version" />
<many-to-one name="Application">
<column name="id" sql-type="int" not-null="true" />
</many-to-one>
</class>
</hibernate-mapping>
答案 0 :(得分:0)
所以这个改变似乎使它有效:
<composite-id>
<key-many-to-one name="Application" class="Application" column="id" />
<key-property name="CertificateNumber" column="certificate_number" />
</composite-id>
<!-- must be first element after id-->
<version column="version" name="Version" />
<property name="Id" update="false" insert="false" >
<column name="id" sql-type="int" not-null="true" />
</property>