Pergunta

Estou tentando aprender Vaadin. Estou realmente confuso como fazer qualquer tipo de desenvolvimento de aplicativos com persistência, porque se eu tiver uma referência aos meus objetos de camada de serviço, eles serão armazenados em sessão e eu realmente não quero isso. O material de persistência simplesmente não é serializável.

Meu caso é que eu já tenho um aplicativo feito que usa a primavera e estou criando uma nova interface do usuário com o Vaadin. Posso injetar as coisas da primavera no meu aplicativo Vaadin, mas isso é armazenado na sessão. Alguma dica?

A propósito, como você publica nos fóruns Vaadin? Não consigo encontrar um botão de postagem ou maneira de me registrar :)

Foi útil?

Solução 3

Parece que o livro Vaadin aborda esta edição. A solução que eles recomendam é usar o ThreadLocal para armazenar os objetos de serviço. O Threadlocal é inicializado e destruído no transação e no transactionend da classe de aplicativo.

Instruções mais detalhadas no livro Vaadin: http://vaadin.com/book/-/page/advanced.global.html

Outras dicas

Minhas sugestões:

  • Defina seus recipientes como apenas contendo apresentação dados. Não mantenha referências diretas de seus objetos de apresentação para seus objetos persistentes.
  • Defina uma operação de "carga" que, dentro de uma transação, carrega os objetos de dados persistentes e os converte nos objetos de apresentação correspondentes que retornam ao seu contêiner.
  • Faça de todos os seus contêineres somente leitura (seguindo o padrão de visualização do modelo: o contêiner é o modelo)
  • Configure notificações/gatilhos conforme necessário para recarregar seus contêineres quando os dados persistentes subjacentes mudarem.
  • Para escalabilidade, projetar ou usar recipientes que sabem como carga preguiçosa, etc., para que você não preencha o contêiner inteiro de uma só vez (Nota: Difícil com TreeTable - Vejo Edição #9516)

Você já tentou isso http://vaadin.com/directory#addon/enterprise-app. Este complemento usa a primavera e o hibernado.

Eu uso hibernato com vaadin. Minha classe principal de aplicativo tem um método de fábrica de sessão:

    public Session getSession() {
    Session currentSession = HibernateUtil.getSessionFactory()
            .getCurrentSession();
    if(!currentSession.getTransaction().isActive()) {
        currentSession.beginTransaction();
    }
    return currentSession;
}

Toda classe que precisa persistir qualquer coisa usará uma referência ao aplicativo principal e depois pegue uma sessão.

Então eu tenho uma camada de serviço que usa consultas nomeadas HQL, então retorna esses dados como listas.

    public List<DataClass> getEntriesforDate(Date date, Integer key) {
    return mainApp.getSession().getNamedQuery(DataClass.NAMEDQUERY)
            .setParameter("key", key).list();
}

Para salvar, você apenas tem uma classe ORM mapeada para uma tabela, você preenche uma instância dessa classe e usa a mesclagem para persistir o objeto:

getSession().merge(o);

Aqui está uma explicação detalhada do Wiki Vaadin:

Hiberna com vaadin

No Vaadin, os dados de persistência não são armazenados em sua sessão, então você não precisa se preocupar com isso.

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