Fechar conexão Hibernate - Apostila V-Raptor

Olá, estou seguindo a apostilo FJ28 da caelum e estou como dúvidas de como usar de como usar esta classe de conexão com o Hibernate:

AbreSession:

[code]@Component
public class AbreSession implements ComponentFactory {

private final SessionFactory factory;
private Session session;

public AbreSession(SessionFactory factory) {
    this.factory = factory;
}

@PostConstruct
public void abre() {
    this.session = factory.openSession();
    System.out.println("Abre conexão");
}

public Session getInstance() {
    return this.session;
}

@PreDestroy
public void fecha() {
    this.session.close();
    System.out.println("Fecha conexão");
}

}[/code]
CriadorDeSessionFactory:

[code]@Component
@ApplicationScoped
public class CriadorDeSessionFactory implements ComponentFactory {

private SessionFactory factory;

@PostConstruct
public void abre() {
    AnnotationConfiguration configuration = new AnnotationConfiguration();
    configuration.configure();
    this.factory = configuration.buildSessionFactory();
    ;
}

public SessionFactory getInstance() {
    return this.factory;
}

@PreDestroy
public void fecha() {
    this.factory.close();
}

}[/code]
Bom no meu DAO faço assim:

[code]@Component
public class ClienteDao {

private final Session session;
public ClienteDao(Session session){
    this.session = session;
}
 public void gravar(Cliente cliente, Session sessio) {
    SessionFactory factory = new CriadorDeSessionFactory().getInstance();
    Session session = new AbreSession(factory).getInstance();
    Transaction tx = session.beginTransaction();
    cliente.setData_cadastro(new Date());
    cliente.setPlaca("PLUS");
    cliente.setMercado("RESIDENCIAL");
    cliente.setNewsletter("S");
    System.out.println("Titulo logradouro: " + cliente.getTitulo_logradouro());
    session.save(cliente);
    tx.commit();
}[/code]

Na Controller tá assim:

public void adiciona(Cliente cliente, Usuario usuario) throws AddressException, MessagingException { SessionFactory factory = new CriadorDeSessionFactory().getInstance(); Session session = new AbreSession(factory).getInstance(); ClienteDao dao = new ClienteDao(session); validator.onErrorUse(Results.page()).of(ClienteController.class).index2(); String existeDocumento = dao.existeCpf(cliente.getCpf(), session); if (existeDocumento != null && existeDocumento.equals(cliente.getCpf())) { validator.add(new ValidationMessage("Já existe um cliente cadastrado com este CPF!", "")); validator.onErrorUse(Results.page()).of(ClienteController.class).Tela_Cliente_Manter(); } else { dao.gravar(cliente, session); String documento = cliente.getCpf(); int x = dao.pesquisaCod(documento); usuario.setGrupo("Cliente"); daousuario.adiciona(usuario, x); } result.redirectTo(ClienteController.class).index2(); }
Estou usando da forma correta?