我是nhibernate的新手所以这应该很容易。我有一个映射文件,如下所示,虽然我删除了一些与此问题无关的字段。 streamfields类包含一袋fieldmappings。我希望连接在field_no列上,但发送的sql在id字段(str_fld_id“)上,如下所示。
我看到下面的sql正在做什么,但这不是我想要的。它正在尝试根据StreamFields类中id列str_fld_id中找到的值来查询field_mappings表,当时我认为很清楚我希望在两端都使用field_no。我说我认为很清楚,因为field_mapping类的映射具有以下属性,并且它们都具有相同的命名字段 下面是我的FieldMappings映射文件。
<many-to-one name="FieldNo" cascade="none" column="`Field_No`" not-null="true">
NHibernate:选择fkfieldmap0 _。[field_no] as field5_1_,fkfieldmap0 _。[Mapping_Id] as Mapping1_1_,fkfieldmap0 _。[Mapping_Id] as Mapping1_3_0_,fkfieldmap0 _。[Std_fld_Id] as Std2_3_0_,fkfieldmap0 _。[Field_Position] as Field3_3_0_,fkfieldmap0 _。[Field_No ]如Field4_3_0_ FROM [Field_Mappings] fkfieldmap0_ WHERE fkfieldmap0 _。[field_no] = @ p0; @ p0 = '20'
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="DataTransfer.StreamFields,DataTransfer" table="`stream_fields`" lazy="true">
<id name="StrFldId" column="`str_fld_id`" type="int">
<generator class="native" />
</id>
<property type="int" not-null="true" name="FieldNo" column="`field_no`" />
<many-to-one name="StreamId" cascade="none" column="`stream_Id`" />
<bag name="FkFieldMappingsStreamFields" inverse="true" lazy="false" cascade="all">
<key column="`field_no`" />
<one-to-many class="DataTransfer.FieldMappings,DataTransfer"/>
</bag>
</class>
答案 0 :(得分:0)
[编辑 - 旧评论]
好吧,我想我终于把你弄好了,我可能会承认我理解你想要的问题花了我一段时间,导致你提供的信息不足。将来请提供两个表的映射,以澄清它是映射还是查询问题。 THX。
IMO你误解了父/子关系的想法。 您提到的在StreamFields类中包含的包不应该是包,而是直接关联。像这样:
<class name="DataTransfer.StreamFields,DataTransfer" table="stream_fields" >
<id name="StrFldId" column="str_fld_id" type="int">
<generator class="native" />
</id>
<property type="int" not-null="true" name="FieldNo" column="field_no" />
<many-to-one name="FieldMapping" class="FiueldMapping" column="Field_No" />
</class>
这当然只有在你的班级中有类型为FiledMapping的属性时才有效。
您希望将FieldMapping映射到StreamFields类中的Field_No列。此列中只能有一个值,所以一个包完全没有意义。如果你想拥有一个包当然你可以保持它已经工作的方式,但要注意包内的'key-column'指的是子表 - 换句话说它没有意义因为ForeignKey必须映射到其父表上的PrimaryKey。这确保了它的独特性和设定性。 我真的不想咆哮,但强烈建议您查看关于集合映射的hibernate参考,以获得更深层次的线索。
希望这能解决您的问题。
答案 1 :(得分:0)
以下是课程的映射。
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="DataTransfer.StreamFields,DataTransfer" table="`stream_fields`" lazy="true">
<id name="StrFldId" column="`str_fld_id`" type="int">
<generator class="native" />
</id>
<property type="string" length="50" name="FieldName" column="`field_name`" />
<property type="int" name="InputFieldPosition" column="`input_field_position`" />
<property type="int" name="Start" column="`start`" />
<property type="int" name="Width" column="`width`" />
<property type="string" length="50" name="Datatype" column="`datatype`" />
<property type="int" not-null="true" name="FieldNo" column="`field_no`" />
<property type="int" name="FieldOrder" column="`field_order`" />
<property type="int" name="StdId" column="`Std_Id`" />
<many-to-one name="StreamId" cascade="none" column="`stream_Id`" />
<bag name="FkFieldMappingsStreamFields" inverse="true" lazy="false" cascade="all">
<key column="`field_no`" />
<one-to-many class="DataTransfer.FieldMappings,DataTransfer"/>
</bag>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="DataTransfer.FieldMappings,DataTransfer" table="`Field_Mappings`" lazy="false">
<id name="MappingId" column="`Mapping_Id`" type="int">
<generator class="native" />
</id>
<property type="int" name="StdFldId" column="`Std_fld_Id`" />
<property type="int" name="FieldPosition" column="`Field_Position`" />
<many-to-one name="FieldNo" cascade="none" column="`Field_No`" not-null="true" property-ref="FieldNo" />
</class>
</hibernate-mapping>
为了方便自己,stream_fields中有一条记录,field_no值为1,而StrFldId中的值为20。
选择fkfieldmap0 _。[field_no] as field5_1_,fkfieldmap0 _。[Mapping_Id] as Mapping1_1_,fkfieldmap0 _。[Mapping_Id] as Mapping1_3_0_,fkfieldmap0 _。[Std_fld_Id] as Std2_3_0_,fkfieldmap0 _。[Field_Position] as Field3_3_0_,fkfieldmap0 _。[Field_No] as Field4_3_0_ FROM [Field_Mappings] fkfieldmap0_ WHERE fkfieldmap0 _。[field_no] = @ p0; @ p0 = '20' -