Observer + Hibernate + SwingBean

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

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

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

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.

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

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.

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?

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

vlw…vou pensar se eu conseguir posto alguma coisa

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

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…

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.