如何映射多对多的反身关系与JPA中的额外列相关联

时间:2011-03-25 15:01:39

标签: jpa many-to-many extra

我正在尝试使用JPA over Hibernate来映射USER / FRIEND关系。通风船有一个额外的coloumn friendShipStatus,描述请求的朋友是否已接受友谊请求。 这是我想通过映射得到的数据库模型。

User
=====
Id
Name
etc...

UserFriend
===========
UserId ( foreign key --> user_id)
FriendId ( foreign key --> user_id)
userFriendStatus
FriendShipRequestDate

我还需要使用这个relationShips的代码示例。

1 个答案:

答案 0 :(得分:1)

由于连接表中有其他列,因此无法使用ManyToMany进行映射。它必须映射为两个OneToMany关系:

一个用户(来源)有很多友谊

一个友谊是针对一个来源用户(要求友谊的用户)

一个友谊是针对一个目标用户(必须接受友谊的用户)

因此,您应该拥有以下实体:

@Entity
public class User {
    // ...
    /**
     * the list of friendships asked by this user
     */
    @OneToMany(mappedBy = "sourceUser")
    private List<Friensdship> frienships = new ArrayList<Friendship>();

}

@Entity
public class Friendship {
    // ...
    /**
     * the user who asked the friendship
     */
    @ManyToOne()
    @JoinColumn(name = "user_id")
    private User sourceUser;

    /**
     * the user to whom the friendship was asked
     */
    @ManyToOne()
    @JoinColumn(name = "friend_id")
    private User targetUser;
}

如果需要,您还可以在用户中添加反向关系:

/**
 * the list of friendships asked to this user
 */
@OneToMany(mappedBy = "targetUser")
private List<Friendship> requestedFriendships = new ArrayList<Friendship>();