У меня проблемы с настройкой моей привязки Hibernate один-ко-многим с помощью карты.У меня есть 3 таблицы: UserTable
, MessageTable
и RecipientTable
.Здесь таблица получателей содержит информацию о сообщении - какой пользователь получил / прочитал сообщение.Это означает, что каждое сообщение будет иметь несколько связанных получателей.Получатель похож на «точку зрения пользователя» на сообщение.Я хочу быть в состоянии получить RecipientTable
из MessageTable
по receiverId
этого конкретного сообщения.Я попытался сделать это следующим образом.
MessageTable.java
@Entity
@Table(name = "MESSAGE")
public class MessageTable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "MESSAGE_ID", nullable = false)
private Long messageId;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "SENDER_ID", nullable = false)
private UserTable sender;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "RECEIVER_ID", nullable = false)
private UserTable receiver;
@OneToMany(mappedBy = "message", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
private Map<Long, RecipientTable> recipients = new HashMap<>();
RecipientTable.java
@Entity
@Table(name = "RECIPIENT")
public class RecipientTable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "RECIPIENT_ID", nullable = false)
private Long recipientId;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "SENDER_ID", nullable = false)
private UserTable sender;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "RECEIVER_ID", nullable = false)
private UserTable receiver;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "MESSAGE_ID", nullable = false)
private MessageTable message;
@Enumerated(EnumType.STRING)
@Column(name = "SEENSTATUS", nullable = false)
private SeenStatus seenStatus;
@Enumerated(EnumType.STRING)
@Column(name = "RECEPTIONSTATUS", nullable = false)
private ReceptionStatus receptionStatus;
Итак, проблема в этой строке:
@OneToMany(mappedBy = "message", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
private Map<Long, RecipientTable> recipients = new HashMap<>();
Я пробовал разные вещи, такие как добавление @MapKey(name = "receiver.userId")
, но ни одна из них не работает.Как правильно достичь этого?