Вы не можете сделать это, поскольку связанное множество объектов (т. Е. Сообщение) должно быть значением Карты.Вам нужно сделать это наоборот, чтобы сопоставить ключ как идентификатор сообщения и значение как экземпляр сообщения:
@Entity
@Table(name = "boards")
public class Board {
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true , mappedBy = "owner")
@MapKey(name = "id")
private Map<UUID, Message> messages = new HashMap<>();
}
Кроме того, обратите внимание, что я внесу два изменения в ваше сопоставление выше:
Используйте Map
вместо HashMap
при объявлении типа Message
. В противном случае у него будет следующая ошибка:
Причина: org.hibernate.AnnotationException: тип коллекции java.util.HashMap не поддерживается для свойства`
Используйте mappedBy
, чтобы иметь двунаправленное отображение «один ко многим», и пусть«много» стороны для управления отношениями для лучшей производительности. (См. это )
Я хочу каскадно и удалить все сообщения вдоска при удалении доски.
На самом деле вам не нужно отображать Message
как карту, чтобы сделать это.Вы также можете достичь этого, просто отобразив его как список.Коды для этого приведены ниже, и вы можете видеть, что вам не нужно манипулировать идентификатором сообщения.Все, что вам нужно, это получить идентификатор форума, который вы хотите удалить.
@Transactional
public void deleteBoard(String boardId){
Board board = entityManager.getReference(Board.class, boardId);
entityManager.remove(board);
}