Как сохранить карту <Entity, Integer> с JPA? - PullRequest
4 голосов
/ 28 сентября 2011

Я работаю над переносом некоторого кода, который имеет две сущности (Progress и PerformanceRating), которые связаны отношением «многие ко многим». Каждый PerformanceRating имеет несколько Progress, и каждый тип Progress может быть назначен нескольким PerformanceRating. Кроме того, каждый PerformanceRating-> Progress имеет дополнительное значение «количества», которое относится к прогрессу.

Текущий объект PerformanceRating содержит карту, представляющую «сумму» прогресса для каждого типа прогресса, назначенного объекту PerformanceRating.

Кодируется следующим образом:

@Entity
class PerformanceRating{
....
....
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "performance_rating_progress_reward", joinColumns = { @JoinColumn(name = "id", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "amount", nullable = false, updatable = false) })
public Map<Progress, Integer> getRewardAmountByProgressMap() {
    return this.rewardAmountByProgressMap;
}

Однако, когда я запускаю JBoss (с Hibernate 3.6 / JTA / JPA), я получаю следующую ошибку:

Use of @OneToMany or @ManyToMany targeting an unmapped class: fwl.domain.model.PerformanceRating.rewardAmountByProgressMap[java.lang.Integer]

Я нашел похожий поток ( Сохранение карты с JPA ), но, похоже, он имеет дело с типами, не являющимися объектами. Каков правильный синтаксис в моем случае, когда я ищу отображение типа сущность / значение?

Есть ли способ сделать это в Hibernate / JPA2?

Спасибо

Эрик

1 Ответ

2 голосов
/ 28 сентября 2011

Ошибка, которую вы получите:

Использование @OneToMany или @ManyToMany для таргетинга на не отображенный класс: fwl.domain.model.PerformanceRating.rewardAmountByProgressMap [ java.lang.Integer ]

относится к тому факту, что с такими аннотациями, как @OneToMany и @ManyToMany, вы говорите, что декларирующий класс (PerformanceRating) находится в отношении многие ко многим со значением вашей карты , Integer что глупо .

Значением вашей карты должна быть сущность, ключом которой должен быть идентификатор, с помощью которого вы можете идентифицировать одну из тех сущностей, которые содержит ваша карта (на самом деле ключ должен быть только уникальным, я думаю, это не обязательно фактический идентификатор).


Я действительно не знаю, как выглядит ваш стол, но если ваш PerformanceRating (для простоты назовем его просто Rating) выглядит так:

rating
============
id               int(11) PK

и ваш Progress стол вот так:

progress
============
id               int(11) PK
amount           int(11)

с таблицей, соединяющей их следующим образом:

progress_has_rating
============
progress_id      int(11) PK
rating_id        int(11) PK

тогда вы можете отобразить их следующим образом:

@Entity @Table class Rating {
  @Id long id;
  @ManyToMany(targetEntity = Progress.class,
              cascade = CascadeType.ALL,
              fetch = FetchType.EAGER)
  @JoinTable(name = "progress_has_rating",
             joinColumns = {@JoinColumn(name = "rating_id", 
                                        referencedColumnName = "id")},
             inverseJoinColumns = {@JoinColumn(name = "progress_id",
                                               referencedColumnName = "id")})
  Set<Progress> progresses;
}

@Entity class Progress {
  @Id long id;
  @Basic long amount;
}

(Вполне возможно, что я переключил имена столбцов в аннотациях @JoinColumn, которые действительно будут работать; я всегда включаю их.)

(Правка: да, я их переключил - исправлено.)


Если ваше свойство amount находится в вашей таблице соединений, то вам также потребуется создать класс сущностей для этого. Я думаю, что невозможно обойти .

Если вы действительно хотите использовать карты, то Hibernate может справиться с этим. См. Раздел Отображение коллекции (в частности, раздел 7.2.2.2) о том, как отобразить карты . Тем не менее, значения на вашей карте должны быть какими-то объектами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...