Лучший способ сделать это - использовать коллекцию элементов.
@Entity
public class Exam {
@CollectionOfElements(fetch = FetchType.LAZY)
@JoinTable(name = "EXAM_CATEGORY", joinColumns = @JoinColumn(name = "FK_EXAM"))
public Set<CategoryEntry> getCategories() {
return this.categories;
}
}
@Embeddable
public class CategoryEntry{
private Category category;
private User user;
@ManyToOne
@JoinColumn(name = "FK_CATEGORY", nullable = false)
public Category getCategory() {
return this.category;
}
@ManyToOne
@JoinColumn(name = "FK_USER", nullable = false)
public User getUser() {
return this.user;
}
// ... setters and such
}
@Entity
public class Category {
}
Этот подход более чист, чем отображение его как сущности, поскольку логически это не сущность с самого начала.
Затем вы можете добавить некоторые другие методы в Exam
, чтобы получить все категории (без пользователей) или получить их в виде карты или что-то еще. Вы можете полностью скрыть этот промежуточный объект через инкапсуляцию, если это требуется.