簡體   English   中英

Hibernate同時進行多對多和多對一映射

[英]Hibernate simultaneous many-to-many and many-to-one mapping

我有一個關於Hibernate創建數據庫方案的問題。

在我們的項目中,我們有用戶和組。 組只有一個所有者,可以有多個成員。 用戶可以是多個組的所有者和成員。

我們提出了以下Hibernate映射:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="model.User" table="ProductUser">
    <id name="id" column="userId">
        <generator class="native"/>
    </id>
    <property name="email"/>
    <property name="firstName"/>
    <property name="lastName"/>

    <set name="ownedUserGroups" table="UserGroup" inverse="true">
        <key column="userId"/>
        <one-to-many class="model.UserGroup"/>
    </set>

    <set name="userGroups" table="Members" inverse="false" lazy="true" fetch="select">
        <key column="userId"/>
        <many-to-many column="userGroupId" class="model.UserGroup"/>
    </set>
</class>

<class name="model.UserGroup" table="UserGroup">
    <id name="id" column="userGroupId">
        <generator class="native"/>
    </id>
    <property name="name"/>

    <many-to-one name="owner" class="model.User" column="owner_UserId"/>

    <set name="members" table="Members" inverse="true" lazy="true" fetch="select">
        <key column="userGroupId"/>
        <many-to-many column="userId" class="model.User"/>
    </set>

</class>
</hibernate-mapping>

Hibernate為我們創建的數據庫方案看起來如下:Hibernate創建的數據庫方案

有人可以解釋為什么usergroupuserid作為外鍵嗎? (如圖所示)

為了完整起見,這里是User和UserGroup的代碼:

public class User {
    private int id;
    private String firstName;
    private String lastName;
    private String email;
    private Set<UserGroup> ownedUserGroups;
    private Set<UserGroup> userGroups;

    public User() {
        this.ownedUserGroups = new HashSet<>();
        this.userGroups = new HashSet<>();
    }

    public User(String firstName, String lastName, String email) {
        this();
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
    }
    // getters and setters
}

public class UserGroup {
    private int id;
    private String name;
    private User owner;
    private Set<User> members;

    public UserGroup() {
        this.members = new HashSet<>();
    }

    public UserGroup(String name, User owner, HashSet<User> members) {
        this.name = name;
        this.owner = owner;
        this.members = members;
    }
    // getters and setters
}

好。 問題在於您的多對一映射。 您正在嘗試將ownUserGroups設置為userId等於當前用戶的id的所有組。 但是,您需要查找owner_UserId等於用戶ID的所有組。 基本上你只需要用owner_UserId替換userId。 您的最終映射文件應如下所示:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="model.User" table="ProductUser">
    <id name="id" column="userId">
        <generator class="native"/>
    </id>
    <property name="email"/>
    <property name="firstName"/>
    <property name="lastName"/>

    <set name="ownedUserGroups" table="UserGroup" inverse="true">
        <key column="owner_userid"/> <!-- CHANGED -->
        <one-to-many class="model.UserGroup"/>
    </set>

    <set name="userGroups" table="Members" inverse="false" lazy="true" fetch="select">
        <key column="userId"/>
        <many-to-many column="userGroupId" class="model.UserGroup"/>
    </set>
</class>

<class name="model.UserGroup" table="UserGroup">
    <id name="id" column="userGroupId">
        <generator class="native"/>
    </id>
    <property name="name"/>

    <many-to-one name="owner" class="model.User" column="owner_UserId"/>

    <set name="members" table="Members" inverse="true" lazy="true" fetch="select">
        <key column="userGroupId"/>
        <many-to-many column="userId" class="model.User"/>
    </set>

</class>
</hibernate-mapping>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM