Persistindo uma lista de elementos com chaves compostas

votos
0

Eu estou usando Java Persistence para salvar uma lista de entidades que estão associados a uma outra entidade. Aqui está um rápido resumo de onde eu estou tendo alguns problemas.

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

Essencialmente, devido a uma arquitetura que não posso mudar, eu preciso salvar uma lista de categorias como sendo atribuído a uma oferta.

Agora, eu estou recebendo uma lista de categorias do usuário e, em seguida, colocá-los no campo offerCategories da Oferta. No entanto, isso não funciona para novas ofertas, porque não há nenhuma maneira para que eu definir o ID de um novo item.

Eu sou novo para JPA e Seam, por isso, se alguém poderia me dar uma cutucada na direção certa seria muito apreciada.

Publicado 27/08/2009 em 00:26
fonte usuário
Em outras línguas...                            


3 respostas

votos
0

Bem, a minha solução para agora é que eu persistir cada um (a criação de chaves para novas entradas), então enchê-los em uma lista, então enchê-los em seu objeto de recipiente, em seguida, persistir esse objeto.

Respondeu 30/10/2009 em 21:47
fonte usuário

votos
0

Quando olhei para tutorial que eu encontrei este :

Você não pode usar um IdentifierGenerator para gerar chaves compostas. Ao invés, a aplicação deve atribuir seus próprios identificadores.

Então você tem que atribuir o id por si mesmo. Talvez você pode fazer uma seqüência DB e buscar seus valores com consulta nativa?
E uma observação - se você quiser usar o mapeamento List (ordem das categorias em oferta é definida pelo banco de dados), você precisa de uma coluna de índice para conter o índice na lista. Se a ordem das categorias não é importante, Set seria mais conveniente.

Respondeu 28/08/2009 em 15:44
fonte usuário

votos
0

Eu não tentei usando um ID composite antes, mas uma coisa a notar é que @Column só é usada para alterar as propriedades da coluna de banco de dados o campo está usando. Não estabelece uma relação, então você ainda precisa de algo como isto:

@OneToMany    
List<OfferCategory> offerCategories;
Respondeu 27/08/2009 em 23:49
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more