返回介绍

双向 N-N 关联

发布于 2025-01-04 01:27:29 字数 2191 浏览 0 评论 0 收藏 0

双向 N-N 关联需要两端都使用 set 集合属性,两端都增加对集合属性的访问。

在双向 N-N 关联的两边都需指定连接表的表名及外键列的列名. 两个集合元素 set 的 table 元素的值必须指定,而且必须相同。set 元素的两个子元素:key 和 many-to-many 都必须指定 column 属性,其中,key 和 many-to-many 分别指定本持久化类和关联类在连接表中的外键列名,因此两边的 key 与 many-to-many 的 column 属性交叉相同。也就是说,一边的 set 元素的 key 的 cloumn 值为 a,many-to-many 的 column 为 b;则另一边的 set 元素的 key 的 column 值 b,many-to-many 的 column 值为 a。
图 3 对于双向 n-n 关联,必须把其中一端的 inverse 设置为 true, 否则两端都维护关联关系可能会造成主键冲突。

域模型

图 4

关系数据模型

图 5

代码实现

实体类

与上文中实体类相似,但是在 Item 中增加了 category 的 set 集合。

public class Category {
    private Integer categoryId;
    private String catregoryName;

    private Set<Item> items = new HashSet<Item>();
  //省去 get 和 set 方法
}
public class Item {
    private Integer itemId;
    private String itemName;
    //省去 get 和 set 方法
}

Category.hbm.xml

与上文中相同,不再复述。

Item.hbm.xml

<hibernate-mapping package="com.lihui.hibernate.single_n_n">
    <class name="Item" table="ITEMS">
        <id name="itemId" type="java.lang.Integer">
            <column name="ITEM_ID" />
            <generator class="native" />
        </id>
        <property name="itemName" type="java.lang.String">
            <column name="ITEM_NAME" />
        </property>
        <set name="categories" table="CATEGORIES_ITEMS" inverse="true">
            <key>
                <column name="I_ID"></column>
            </key>
            <many-to-many class="Category" column="C_ID"></many-to-many>
        </set>
    </class>
</hibernate-mapping>

Notice

注意要在其中一端加入 inverse="true" ,否则会造成主键冲突。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文