有两个表Person和Address。我有一个映射表PersonAddressMap,它包含一个额外的列IsCurrent而不是两个外键(没有显式的主键列)。我为Person,Address和PersonAddressMap创建了三个映射类。我需要访问一个Person的所有地址,并访问所有具有Address地址的人员,所以我在Person和Address类中都有一对多的PersonAddressMap。现在的问题是双向关联正在创造一个infiniteloop。如果我删除其中一个关联,加载工作正常,但Save没有插入到映射表中(例如:如果我只有一个从Person到PersonAddressMap的关联并尝试插入一个具有新地址的新Person,那么只有Person是插入。)映射文件看起来像这样,
<class name="Person" table="Person">
<id name="Id">
<column name="Id" sql-type="int" not-null="true" />
<generator class="identity" />
</id>
<property name="Name" column="Name"/>
<bag name="AddressDetails" table="PersonAddressMap" cascade="all" >
<key column="PersonId" />
<one-to-many class="PersonAddressMap" />
</bag>
</class>
<class name="Address" table="Address">
<id name="Id">
<column name="Id" sql-type="int" not-null="true" />
<generator class="identity" />
</id>
<property name="City" column="City"/>
<bag name="PersonDetails" table="PersonAddressMap" cascade="all" >
<key column="AddressId" />
<one-to-many class="PersonAddressMap" />
</bag>
</class>
<class name="Job" table="Job" lazy="false">
<composite-id>
<key-many-to-one column="PersonId" name="Person" />
<key-many-to-one column="AddressId" name="Address" />
</composite-id>
<property name="IsCurrent" column="IsCurrent"/>
</class>
提前致谢。
答案 0 :(得分:0)
多对多关系始终要求您使用inverse标记关系的一个端点。在您的特定示例中,您可以使用Person的AddressDetails。 e.g。
<bag name="AddressDetails" table="PersonAddressMap" cascade="all" inverse="true">
<key column="PersonId" />
<one-to-many class="PersonAddressMap" />
</bag>
答案 1 :(得分:0)
当我使用inverse ='true'时,不会插入连接表值(即PersonAddressMap)。
如果我设置inverse ='false',它们会被插入,但我也看到sql中出现删除语句