【问题标题】:Mapping same class relation映射相同的类关系
【发布时间】:2010-09-28 14:42:57
【问题描述】:

嗨 我正在尝试在 hibernate 中映射一些类,并且遇到了如何完成这种映射的一般问题。 有用户类和 Facebook 用户类,其结构如下 用户等级:

public class User{
 public User(){}
 Long Id;
 String FirstName;
 String LastName;
 ....
 FbUser fbuser;
 //// all requred 
 getters and setters...
}

Facebook 类 FbUser 可以拥有属于同一类 FbUser 的对象的好友列表。

public class FbUser{
 public FbUser(){}
 Long fbId;
 String FirstName;
 String LastName;
 List<FbUser> friends;
 //// all requred 
 getters and setters...
}

到目前为止,我在 User 和 FbUser 之间建立了多对一的关系。

<hibernate-mapping>
    <class
        name="User"
        table="User"
    >

        <id
            name="Id"
            column="ID"
            type="java.lang.Long"
            unsaved-value="null"
        >
         <generator class="increment"/>
        </id>

        <property
            name="FirstName"
            update="true"
            insert="true"
            not-null="false"
            unique="false"
            type="java.lang.String"
        >
            <column name="FirstName" />
        </property>
 <property
            name="LastName"
            update="true"
            insert="true"
            not-null="false"
            unique="false"
            type="java.lang.String"
        >
            <column name="LastName" />
        </property>
        <many-to-one
            name="fbUser"
            class="FbUser"
            cascade="all"
            column="fbId"
            unique="true" 
        />

    </class>
</hibernate-mapping>

现在是 FbUser 映射:

<hibernate-mapping>
    <class
        name="FbUser"
        table="FbUser"
    >

        <id
            name="fbId"
            column="fbId"
            type="java.lang.Long"
            unsaved-value="null"
        >
          <generator class="increment"/>
        </id>

        <property
            name="FirstName"
            update="true"
            insert="true"
            not-null="false"
            unique="false"
            type="java.lang.String"
        >
            <column name="FirstName" />
        </property>

        <property
            name="LastName"
            type="java.lang.String"
            update="true"
            insert="true"
            column="LastName"
            not-null="true"
            unique="false"
        />
    </class>
</hibernate-mapping>

如何在 FbUser 映射文件中映射 FbUser 列表?我迷路了:(

【问题讨论】:

    标签: java hibernate orm


    【解决方案1】:

    您可以创建一个名为 MyFriends 的附加类

    public class FbUser {
    
        List<MyFriends> friends = new ArrayList<MyFriends>();
    
    }
    

    只是相关部分

    如果您有索引列

    <hibernate-mapping>
        <class name="FbUser">
            <list name="myFriends">
                <key column="ME_ID" insert="false" update="false"/>
                <list-index column="WHICH COLUMN SHOULD BE USED AS INDEX"/>
                <one-to-many class="MyFriends"/>
            </list>
        </class>
    </hibernate-mapping>
    

    如果您没有索引列

    将你的列表重写为

    public class FbUser {
    
        Collection<MyFriends> friends = new ArrayList<MyFriends>();
    
    }
    

    <hibernate-mapping>
        <class name="FbUser">
            <bag name="columns">
                <key column="ME_ID" insert="false" update="false"/>
                <one-to-many class="MyFriends"/>
            </bag>
        </class>
    </hibernate-mapping>
    

    还有你的 MyFriends 映射。 注意您需要一个复合主键(作为静态内部类实现)

    <class name="MyFriends">
        <composite-id name="myFriendsId" class="MyFriends$MyFriendsId">
            <key-property name="meId"/>
            <key-property name="myFriendId"/>
        </composite-id>
        <many-to-one name="me" class="FbUser" insert="false" update="false"/>
        <many-to-one name="myFriend" class="FbUser" insert="false" update="false"/>
    </class>
    

    你的MyFriends如下所示

    public class MyFriends {
    
        private MyFriendsId myFrinedId;
    
        private FbUser me;
        private FbUser myFriend;
    
        public static class MyFriendsId implements Serializable {
    
            private Integer meId;
            private Integer myFriendId;
    
            // getter's and setter's
    
            public MyFriendsId() {}
            public MyFriendsId(Integer meId, Integer myFriendId) {
                this.meId = meId;
                this.myFriendId = myFriendId;
            }
    
            // getter's and setter's
    
            public boolean equals(Object o) {
                if(!(o instanceof MyFriendsId))
                    return false;
    
                MyFriendsId other = (MyFriendsId) o;
                return new EqualsBuilder()
                           .append(getMeId(), other.getMeId())
                           .append(getMyFriendId(), other.getMyFriendId())
                           .isEquals();
            }
    
            public int hashcode() {
                return new HashCodeBuilder()
                           .append(getMeId())
                           .append(getMyFriendId())
                           .hashCode();
            }
        }
    }
    

    【讨论】:

    • 您好,您的解决方案令人着迷。但是,如果我没有索引行,为什么我应该使用集合而不是列表?为什么我需要复合主键?
    • @danny.lesnik 如果你使用 List,Hibernate 会抱怨你没有索引列。在这里查看原因:stackoverflow.com/questions/3580686/… 您需要一个复合主键,因为您的 ManyToMany 关系“已被拆分”为 OneToMany 关系。当多对多关系拆分为单对多关系时,您需要一个复合主键。 ManyToMany 类似于 OneToMany(具有复合主键)
    • @danny.lesnik 请记住@Plinio Pantaleão 提供的解决方案也可以正常工作。但他用的是一套。 如果你没有一致的 equals 和 hashCode 方法,最好使用 bag 代替,否则,你会得到意外的行为。
    • @danny.lesnik 更正一下:ManyToMany 类似于 OneToMany-ManyToOne FbUser 与 MyFriend (Collection) 具有 OneToMany 关系,而 MyFriend 具有 ManyToOne 与 FbUser 的关系。当您将 ManyToMany 拆分为 OneToMany-ManyToOne 时,加入的类 (MyFriend) 具有复合主键。请参阅此处的另一个示例stackoverflow.com/questions/1212058/…
    • 嗨,你能帮我解决这个问题吗? stackoverflow.com/questions/3845772/…。这是您的建议的实施。
    【解决方案2】:

    首先:用户与 FbUser 是一对一的关系,对吗? 第二:使用列表或集合将 FbUser 映射到 FbUser 作为多对多关系。我在这里有一个 Set 示例:

        <set 
            name="friends"
            table="FbUser" <!-You may use other table here if you want->
            access="field">
            <key 
                column="fbId"/>
            <many-to-many 
                class="bla.bla.bla.FbUser"
                column="friend_id" />
        </set>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-15
      • 1970-01-01
      • 2015-01-01
      • 2019-11-28
      • 1970-01-01
      • 2014-04-25
      相关资源
      最近更新 更多