Как аннотировать связь OneToMany между ключом HashMap и другим классом (Java / JPA / Hibernate) - PullRequest
0 голосов
/ 31 января 2019

Вот два рассматриваемых класса (упрощенно только для соответствующих частей):

Класс сообщения (отношение ManyToOne с классом платы)

@Entity
@Table(name = "messages")
public class Message {

/**
 * Unique identifier for message.
 */
@Id
private UUID id;

@ManyToOne
@JoinColumn(name = "id")
private Board owner;

Класс платы (отношение OneToMany с классом сообщения))

@Entity
@Table(name = "boards")
public class Board {

/**
 * Unique identifier for task.
 */
@Id
private UUID id;

/**
 * Hashmap of all messages currently on Board
 */
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@MapKey(name = "owner")
private HashMap<Message, Integer> messageBoard;

Использование spring-boot-starter-data-jpa версии 2.1.0.RELEASE

Я пытаюсь сопоставить много сообщений одной плате и хочу каскадировать и удалятьвсе сообщения на доске при удалении доски.Мне требуется, чтобы ключом HashMap были сообщения на доске, а значение Integer в HashMap не имеет отношения к полям класса Message.Добро пожаловать в альтернативы, если это невозможно.

1 Ответ

0 голосов
/ 31 января 2019

Вы не можете сделать это, поскольку связанное множество объектов (т. Е. Сообщение) должно быть значением Карты.Вам нужно сделать это наоборот, чтобы сопоставить ключ как идентификатор сообщения и значение как экземпляр сообщения:

@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<>();

}

Кроме того, обратите внимание, что я внесу два изменения в ваше сопоставление выше:

  1. Используйте Map вместо HashMap при объявлении типа Message. В противном случае у него будет следующая ошибка:

    Причина: org.hibernate.AnnotationException: тип коллекции java.util.HashMap не поддерживается для свойства`

  2. Используйте mappedBy, чтобы иметь двунаправленное отображение «один ко многим», и пусть«много» стороны для управления отношениями для лучшей производительности. (См. это )


Я хочу каскадно и удалить все сообщения вдоска при удалении доски.

На самом деле вам не нужно отображать Message как карту, чтобы сделать это.Вы также можете достичь этого, просто отобразив его как список.Коды для этого приведены ниже, и вы можете видеть, что вам не нужно манипулировать идентификатором сообщения.Все, что вам нужно, это получить идентификатор форума, который вы хотите удалить.

@Transactional
public void deleteBoard(String boardId){
  Board board = entityManager.getReference(Board.class, boardId);
  entityManager.remove(board);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...