Как отобразить рефлексивный корабль отношений ManyToMany с дополнительным столбцом в JPA
Я пытаюсь отобразить корабли отношений USER/FRIEND, используя JPA поверх Hibernate. У корабля связи есть дополнительный столбец friendShipStatus, который описывает, принял ли запрошенный друг не запрос дружбы. Это модель базы данных, которую я хочу получить с помощью сопоставления.
User
=====
Id
Name
etc...
UserFriend
===========
UserId ( foreign key --> user_id)
FriendId ( foreign key --> user_id)
userFriendStatus
FriendShipRequestDate
Мне также нужен пример кода, использующего этот отношениях.
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>();