Сохранение списка элементов с составными ключами - PullRequest
0 голосов
/ 27 августа 2009

Я использую постоянство Java, чтобы сохранить список объектов, связанных с другим объектом. Вот краткое изложение того, где у меня возникли некоторые проблемы.

@Entity public class Offer implements Serializable {
  @Id private Long offerId;

  @OneToMany
  @Column List<OfferCategory> offerCategories;
}

@Entity public class OfferCategory implements Serializable {

  @Embeddable public static class Id implements Serializable
  {
      @Column(name="offer_id")
      private Long offerId;

      @Column(name="category_id")
      private Long categoryId;

      public Id() {}

      public Id(Long offerId, Long categoryId) {
          this.offerId = offerId;
          this.categoryId = categoryId;
      }

      public boolean equals(Object o) {
          if(o != null && o instanceof Id) {
              Id other = (Id) o;
              return this.offerId.equals(other.offerId) &&
                      this.categoryId.equals(other.categoryId);
          }
          else
              return false;
      }

      public int hashCode() {
          return offerId.hashCode() + categoryId.hashCode();
      }
  }
  @EmbeddedId private Id id = new Id();
}

По сути, из-за архитектуры, которую я не могу изменить, мне нужно сохранить список категорий как назначенных для предложения.

Сейчас я получаю список категорий от пользователя, а затем помещаю их в поле offerCategories предложения. Однако это не работает для новых предложений, потому что у меня нет возможности установить идентификатор нового элемента.

Я новичок в JPA и Seam, поэтому, если бы кто-то мог дать мне толчок в правильном направлении, это было бы очень признательно.

Ответы [ 3 ]

0 голосов
/ 28 августа 2009

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

Вы не можете использовать IdentifierGenerator для генерации составных ключей. Вместо этого приложение должно назначить свои собственные идентификаторы.

Так что вы должны назначить идентификатор самостоятельно. Может быть, вы можете создать последовательность БД и извлечь ее значения с помощью собственного запроса?
И еще одно замечание - если вы хотите использовать отображение списков (порядок категорий в предложении определяется базой данных), вам нужен столбец индекса, чтобы содержать индекс в списке. Если порядок категорий не важен, Set будет более удобным.

0 голосов
/ 30 октября 2009

Что ж, мое решение на данный момент состоит в том, что я сохраняю каждый из них (создавая ключи для новых записей), затем вставляю их в список, затем помещаю их в объект-контейнер и сохраняю этот объект.

0 голосов
/ 28 августа 2009

Я не пробовал использовать составной идентификатор раньше, но следует отметить, что @Column используется только для изменения свойств столбца базы данных, который используется в этом поле. Это не предусматривает отношения, поэтому вам все еще нужно что-то вроде этого:

@OneToMany    
List<OfferCategory> offerCategories;
...