具有附加列的同一个表上的多对多

时间:2009-12-02 07:21:40

标签: hibernate mapping many-to-many orm

我有一个用户类。用户可以是许多其他用户的朋友。这种关系是相互的。如果A是B的朋友,则B是A的朋友。此外,我希望每个关系都存储其他数据 - 例如,两个用户成为朋友的日期。所以这是一个多对多的关系,在同一个表上有额外的列。我知道应该创建一个中产阶级友谊(包含两个用户ID和日期列)。但我很想用Hibernate映射它。阻止我的是映射到同一个表。如果两个不同的表之间存在多对多的关系,我可以解决它。

3 个答案:

答案 0 :(得分:7)

你说过

  

同一桌上的多对多关系

这不是一个好主意。维持这是一场噩梦。

试试这个

@Entity
public class Friend {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer friendId;

    @Column
    private String name;

    @OneToMany(mappedBy="me")
    private List<MyFriends> myFriends;

}

@Entity
public class MyFriends {

    @EmbeddedId
    private MyFriendsId id;

    @Column
    private String additionalColumn;

    @ManyToOne
    @JoinColumn(name="ME_ID", insertable=false, updateable=false)
    private Friend me;

    @ManyToOne
    @JoinColumn(name="MY_FRIEND_ID", insertable=false, updateable=false)
    private Friend myFriend;

    @Embeddable
    public static class MyFriendsId implements Serializable {

        @Column(name="ME_ID", nullable=false, updateable=false)
        private Integer meId;

        @Column(name="MY_FRIEND_ID", nullable=false, updateable=false)
        private Integer myFriendId;

        public boolean equals(Object o) {
            if(o == null)
                return false;

            if(!(o instanceof MyFriendsId))
                return false;

            MyFriendsId other = (MyFriendsId) o;
            if(!(other.getMeId().equals(getMeId()))
                return false;

            if(!(other.getMyFriendId().equals(getMyFriendId()))
                return false;

            return true;
        }

        public int hashcode() {
            // hashcode impl
        }

    }


}

的问候,

答案 1 :(得分:3)

我不确定这是否适合您的情况,但请试一试。

@Entity
public class Friend {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int friendId;

    @Column
    private String name;

    @ManyToMany(mappedBy="owner")
    private List<Friendship> friendships;
}

@Entity
public class Friendship {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int friendshipId;

    @OneToOne
    private Friend owner;

    @OneToOne
    private Friend target;

   // other info
}

答案 2 :(得分:1)

我遇到了同样的问题。你可以尝试这样的事情:

<class name="Friend" entity-name="RelatedFriend" table="FRIENDS">
    <id name="id" type="long">
        <generator class="native" />
    </id>

    <!-- *** -->

    <set name="relatedFriends" table="RELATED_FRIENDS">
        <key column="FRIEND_ID" />
        <many-to-many column="RELATED_FRIEND_ID" class="Friend" entity-name="RelatedFriend"/>
    </set>
</class>