Um dia desses precisei de mudar uma página (WebPage) para que permitisse persistir um atributo simples em uma entidade. Primeiramente pensei em usar um Enum, porém estou usando persistência JPA com Hibernate, e fiquei com receio da forma como o Hibernate iria manipular esse Enum ao fazer buscas ou coisas mais complicadas. Então decidi criar um atributo do tipo Integer e setar nele uma constante.
Este é um exemplo de código usando um Map para exibir uma lista de opções (DropDownChoice) no Wicket para persistir uma constante (Integer) em uma entidade.
Código da entidade ControlSerum onde vamos persistir o atributo status:
@Entity public class ControlSerum { private Integer status; public final static int STATUS_PREP = 0; public final static int STATUS_ACTIVE = 1; public final static int STATUS_INACTIVE = 2; private final static Map<Integer, String> statusMap = new HashMap<Integer, String>(); static{ statusMap.put(STATUS_PREP, "Em preparo"); statusMap.put(STATUS_ACTIVE, "Ativo"); statusMap.put(STATUS_INACTIVE, "Inativo"); } @Column(nullable=false) public Integer getStatus() { return status; } public void setStatus(Integer status) { this.status = status; } @Transient public static Map<Integer, String> getStatusMap(){ return new HashMap<Integer, String>(statusMap); } }
Na classe da página ControlSerumEditPage, implementei um IChoiceRenderer para renderizar corretamente as opções do select, utilizando a chave do Map como sendo o valor a ser submetido pelo option e o valor do Map como sendo o nome para exibição do option.
Trecho de código do construtor da classe ControlSerumEditPage onde é instanciado e adicionado ao Form, um renderizador para o DropDownChoice:
IChoiceRenderer choicesRenderer = new IChoiceRenderer() { @Override public String getDisplayValue(Integer object) { return ControlSerum.getStatusMap().get(object); } @Override public String getIdValue(Integer object, int index) { return object.toString(); } }; IModel optionsModel = new Model(){ @Override public Serializable getObject() { return new ArrayList(ControlSerum.getStatusMap().keySet()); } }; IModel statusModel = new PropertyModel<Integer>(controlSerum, "status"); DropDownChoice<Integer> status = new DropDownChoice<Integer>("status", statusModel, optionsModel, choicesRenderer); form.add(status);
Para baixar o código completo desta aplicação (ainda em desenvolvimento):
http://github.com/ziglee/biomedcalib
Façam seus comentários e envie quaisquer dúvidas que prontamente responderei!