Duvida padrão facade

A duvida é quanto ao facade. Atualmente quando necessito gravar em banco algo que preciso verificar regra de negocio eu chamo a classe facade e ela encapsula os managers… Nela eu pesquiso metodos pelo manager e após todo o processo eu chamo novamente o manager para gravar…

Esta certo isso? Ou devo utilizar o manager fora do facade?

Ex.:
Na interface preciso gravar um obj. Ex uma partida de futebol que preciso lançar a próxima partida após gravar o resultado da ultima partida.

Pelo managed bean é acionado o gravar, o gravar lança o resultado, se tudo deu certo o próximo passo no managed bean é chamar o facade, que irá lançar a próxima partida, no facade tenho declarado o manager, ele consulta no banco, retorna o adversario, organiza tudo e chama o manager para gravar a próxima partida…

Esta certo isso?

Vc realmente precisa de um Facade?
Pense sempre em simplificar as coisas, e não colocar padrões apenas para colocar.

Poste sua estrutura de classes pra gente entender melhor.

Model - Onde fica as classes do BD

[code]package br.com.joshh.model;

import java.io.Serializable;
import javax.persistence.*;
import java.util.List;

@Entity
public class Time implements Serializable {
private static final long serialVersionUID = 1L;

@Id
    private Long id;
	
private String nome;

.
.
.
.

}
[/code]

Manager - Gravam o objeto no banco. Não pode ir regra de negócio

package br.com.joshh.service;

.
.
.
.

public interface TimeManager extends ManagerPaginado<Time, Long> {
	void gravar(Time time);
	.
	.
	.
	
}
package br.com.joshh.service;

@Bean(name="TimeManager")
@Transactional
public class TimeManagerImpl extends ManagerImpl<Time, Long> 
								 implements TimeManager {

	private static Logger logger = Logger.getLogger(TimeManagerImpl.class);

	@ConstructorArgs(@Property(bean="sessionFactory"))
	public TimeManagerImpl(SessionFactory sessionFactory) {
		super(sessionFactory);
	}
	
	public void gravar(Time time) {
		
		if (time.getId() == 0) { //se tiver inserindo deve gerar PK	
			
			getSession().persist(time);
		}
		else {			
			getSession().merge(time);
		}		
		
	}
}

Facade - Regras Negócio

package br.com.joshh.engine.facade;

public interface PartidaFacade {

	public void gerarNovaPartida(Time time);
}
package br.com.rsdata.dataseesmt.engine.facade.impl;

@Bean(name = "partidaFacade")
@Transactional
public class PartidaFacadeImpl implements PartidaFacade {
	
	private TabelaManager TabelaManager;
	private TimeManager ...;
		
	public void gerarNovaPartida(Time time) {
		tabelaManager.ProximaPartida(Time);
		.
		.
		.
		timeManager.Gravar(time);
	}
}

TimaBean - “Trabalha com a tela”

Gravar () {
TimeFacade.gerarNovo…();

}

Exemplo acima. Por exemplo.

Bom, não sei se esse é o uso certo do facade, mas vou mostrar como tenho usado minhas classes ultimamente.

Exemplo de Cliente:

Entidade: Cliente (mapeada pelo hibernate, tem as lógicas pertinentes ao cliente)
Service: ClienteService (QUANDO NECESSÁRIO, quando se trabalha uma lógica do cliente que envolva operações com outras entidades. Não precisando, não crie à toa)
Repositório: ClienteRepository (interface que vai conter os métodos/operações de persistência referente ao cliente, buscaPorNome(), buscaPorIdade(), salva(), busca(), etc)
Dao: ClienteDao (contém a implementação do reposítório, e é ele que fará ‘contato’ com o BD)

Basicamente é isso, claro que quando usada em uma aplicação web, tem ainda o controller.

Grato.