Observer + Hibernate + SwingBean

11 respostas
leokaos

salve!

seguinte: to fazendo um sistema e estou utilizando o framework SwingBean pra gerar os formularios e tabelas.( Pra quem naum sabe o swingbean monta um formulario atraves de um XML e um Bean e faz binding do formulario com o bean). Tenho uma tela onde eu tenho 3 formulários desse para um mesmo bean, apenas por questão de estetica. Até ae tudo bem. Uso o mesmo bean para o hibernate e para o swingbean. Mas agora preciso saber qdo o bean é modificado para adicionar uma funcionalidade de salvar o objeto, para que o usuário não saia da tela do bean sem salva-lo. Minha pergunta é se alguem saberia de alguma solução para isso. Eu pesquisei sobre o designer pattern Observer, mas ai não sei bem se eh uma boa escolha fazer as classes de entidade estenderem a classe Observable, além de não conseguir fazer funcionar.

se alguem tiver alguma ideia.

vlw

11 Respostas

barbon

Olá,

O ideal seria utilizar o Design Pattern Observer.

Ele é composto de uma [i]interface /i e uma [b]classe /b. Você deve implementar a interface Observer nas classes que você deseja que “recuperem” as modificações das classes observadas, lembrando que o método implementado update() será invocado a cada mensagem da Observable.
Já as classes que você deseja que tenham suas ações “avisadas” às outras classes, você precisará estender Observable e não esquecer de utilizar o método addObserver() para adicionar qual classe receberá a mensagem e terá seu método update() acionado.

Até mais

leokaos

vlw pela resposta!

Então, isso q vc falou eu já fiz, mas em um projeto separado. Achu q o swingbean altera de alguma forma essa questão do Observer para fazer alguma funcionalidade, como o de sincronizar o bean com o formulario. Mas infelizmente como tenho mais de 1 formulario, como dito anteriormente se tento sincronizar os tres formularios em um unico bean, me acusa erro, por isso vim até o forum. Além disso, eh legal fazer a classe de entitidade do hibernate estender a classe observable?

vlw

barbon

Quanto a alguma limitação do Swingbean junto ao Observer, realmente desconheço.

Agora considerando o uso do Observer na Entity do Hibernate, acredito não seu uma boa solução, o ideal é criar uma camada anterior, por exemplo usando um Design Pattern Facade, ou na controller pensando em MVC.

Quanto aos 3 formulários, eles podem sem nenhum problema serem observados por uma mesma classe. Basta adicionar em cada Observable (addObserver()) a classe que implementa Observer.

leokaos

Então, achu q meio q viajei seguinte: eu to fazendo um teste com Observable e Observer, então criei duas classes:

Sala

package entidades;

import java.util.Date;
import java.util.Observable;

public class Sala extends Observable{

    private String nome;
    private Integer numero;
    private Date data;
    private Boolean ocupada;

    public Sala() {
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public Integer getNumero() {
        return numero;
    }

    public void setNumero(Integer numero) {
        this.numero = numero;
    }

    public Date getData() {
        return data;
    }

    public void setData(Date data) {
        this.data = data;
    }

    public Boolean isOcupada() {
        return ocupada;
    }

    public void setOcupada(Boolean ocupada) {
        this.ocupada = ocupada;
    }
}

e SalaObserver

package entidades;

import java.util.Observable;
import java.util.Observer;


public class SalaObserver implements Observer {

    public SalaObserver() {
    }

    public void update(Observable o, Object arg) {
        System.out.println("Chamou aki!");
    }
}

e o teste q faço:

Sala sala = new Sala();
        SalaObserver obs = new SalaObserver();
        sala.addObserver(obs);
        sala.setData(new Date());
        sala.notifyObservers();

então pelo q eu entendi qdo qq propriedade for alterada o observer será ativado certo? ou apenas no metodos q eu chamar setChanged()? Pq se pra cada atributo q eu quiser observar eu tiver q chamar o setChanged(), vai ficar dificil, pois em uma tabela eu tenho 34 atributos!! vou ter q chamar esse metodo em cada set?!!? pois quero saber qdo houver QUALQUER alteração no bean.

:frowning:

vou chorar huahauua

barbon

Os Observers somente serão “avisados” após o setChanged() e o notifyObservers().

Agora você deve pensar em uma estratégia para a notificação.

leokaos

cabeçada minha até já alterei o post anterior, então pra cada atributo tenho q chamar o setChanged()?!? oh hell…ae azedou…imagine colocar 34 setChanged…vai poluir o codigo…q droga…naum tem nenhuma outra opção pra resolver esse problema?

barbon

O ideal não é colocar direto na entidade. A melhor opção seria uma camada anterior, nela seriam notificados os observadores.

leokaos

vlw…vou pensar se eu conseguir posto alguma coisa

T

Leokas,
Estou começando desenvolver utilizando o FrameWork SwingBean( apenas em fase de teste para ver se funcionaria como eu quero em uma aplicação real)
nesse caso não seria legal fazer uma comparação com o bean inicial e o bean sincronizado(binding)?
Ai daria para saber se ele foi modificado

leokaos

então tem 2 problemas nessa solução: primeiro, para fica melhor a visualização desse formulario eu dividi em 6 formularios o bean pq ele tem 30 campos, entaum se vc tentar fazer binding nos 6 forms, vai dar erro, acredite eu jah tentei essa solução. Além disso, eu preciso saber quando o bean for modificado para assim habilitar o botão de salvar, realmente eu conseguiria fazer a comparação entre beans comparando atributo a atributo, e mesmo utilizando reflection para não precisar fazer um if com 60 gets, eu não saberia exatamente quando ele foi modificado. E mesmo assim eu teria q colocar pra cada set um firePropertyChange, o q eu achu q seria uma gambiarra, e ainda alterando o objeto de negocio do hibernate. :frowning: tenso viu…

T

Eu vou enfrentar o mesmo problema que você
eu já estou estendendo algumas classes do Swing Bean e adequando algumas para minhas necessidades
E vou precisar fazer isso que você mesmo falou.
Criar formulários separados para melhor visualização, e passar para 1 único Bean, mais acredito que isso é fácil adaptar no Swing bean isso.
Além do mais meus formulários acessa varios Beans ao mesmo tempo, não cheguei nessa parte para ver se vou enfrentar problemas.

Criado 11 de janeiro de 2011
Ultima resposta 20 de jan. de 2011
Respostas 11
Participantes 3