Pergunta

Eu tenho uma lista de objetos e cada objeto na lista de ocupar uma posição que não pode mudar a menos que mudou de forma explícita, em outras palavras, os objetos estão em uma fila. Que coleção devo usar na minha classe de entidade para armazenar esses objetos e como deve essa coleção ser anotada?

Actualmente tenho esta

@Entity
class Foo {
  ...
  @OneToMany(mappedBy = "foo", cascade = CascadeType.ALL)
  List<Bar> bars = new ArrayList<Bar>();
  ...
}

Se isto não é possível com JPA puramente, estou usando EclipseLink como meu provedor de JPA, de modo anotações específicas EclipseLink será ok se nada mais ajuda.

EDIT: Nota pessoas, o problema não é que Java não Preserv a ordem, eu sei que a maioria das coleções fazer, o problema é que eu não sei uma maneira inteligente para JPA para Preserv a ordem. Ter um ID de ordem e fazer o pedido de consulta por ela é possível, mas no meu caso mantendo a ID do pedido é trabalhoso (porque a interface do usuário permite a reordenação de itens) e eu estou procurando uma maneira mais inteligente de fazê-lo.

Foi útil?

Solução

Se você quer este ser encomendado após round-trip to SQL, você deve fornecer algum tipo de ID ordenação dentro da própria entidade - SQL é naturalmente set-orientado, em vez de orientada a lista. Você pode então classificar depois que você pegá-los de volta, ou certificar-se de seus especifica consulta a ordenação também.

Se você dá à entidade uma auto-gerado inteiro ID esta pode trabalho, mas eu não gostaria de garanti-lo.

Outras dicas

Use um ID de ordem de classificação, como Jon sugeriu, em seguida, adicione uma anotação @OrderBy abaixo do @OneToMany. Isto irá pedir qualquer consulta pelo campo especificado.

Por exemplo, se você adicionar um novo campo chamado "SortID" para Bar, Foo ficaria assim:

@Entity
class Foo {
  ...
  @OneToMany(mappedBy = "foo", cascade = CascadeType.ALL)
  @OrderBy("sortId ASC")
  List bars = new ArrayList();
  ...
}

Você pode

  1. Classificar uma lista antes da criação
  2. ordenar uma lista após a criação
  3. Use uma coleção que executa uma espécie de inserção. TreeMap, TreeSet

A vinculado lista implementa o Inteface fila em Java e permite que você adicione coisas no meio ...

TBH a maioria das coleções são ordenados não são ...

Verifique os docs, a maioria dizer se é ou não eles são ordenados.

Vale a pena tentar LinkedList em vez de ArrayList, no entanto, como disse Jon, você precisa encontrar uma maneira de persistir as informações do pedido.

A solução irá provavelmente envolver a emissão de um número de ordem a cada entrada de armazená-lo como um SortedMap, ao converter para a lista, se a lista é que você precisa.

No entanto, ORM poderia ser suficiente inteligente para fazer todas as conversões para você, se você armazenou a coleção como LinkedList.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top