映射同级关系 [英] Mapping same class relation

查看:16
本文介绍了映射同级关系的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

嗨我正在尝试在休眠中映射一些类,并且遇到了如何完成此类映射的一般问题.有 User 类和 Facebook 用户类,其结构如下用户类:

Hi I’m trying to map some classes in hibernate there and have general problem how such mapping can be done. There is User class and Facebook user class which has the following structure User Class :

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

Facebook 类 FbUser 可以拥有属于同一类 FbUser 的 Friends 列表.

Facebook class FbUser can have list of Friends which are objects of the same class FbUser.

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

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

Till now I made many to one relation between User And 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 映射:

And now the FbUser Mapping:

<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 Map 文件中映射 FbUser List?我迷路了:(

Chow can I map FbUser List inside the FbUser Map file? I got lost :(

推荐答案

您可以创建一个额外的类,例如 MyFriends

You can create an additional class named, for instance, 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 映射.注意你需要一个复合主键(实现为静态内部类)

And your MyFriends mapping. Notice you need a composite primary key (implemented as a static inner class)

<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>

你的好友显示如下

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();
        }
    }
}

这篇关于映射同级关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆