Отображение того же отношения класса - PullRequest
1 голос
/ 28 сентября 2010

Привет Я пытаюсь отобразить там некоторые классы в спящем режиме, и у меня есть общая проблема, как сделать такое отображение. Существует класс пользователя и класс пользователя 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 List внутри файла FbUser Map? Я заблудился: (

Ответы [ 2 ]

2 голосов
/ 28 сентября 2010

Вы можете создать дополнительный класс с именем, например, 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>

Ваши друзья отображаются следующим образом

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();
        }
    }
}
2 голосов
/ 28 сентября 2010

Ну, во-первых: пользователь имеет отношение один к одному с 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...