Estou iniciando uma aplicação em java+swing.
Onde instancio os objetos do hibernate?
Já chamo no método main?
Sei que tenho que criar um Configuration, obter um SessionFactory, mas não sei em que parte do código fazer isso.
No meu código eu tenho vários GerenciadorXxxx para deletar, salvar, e carregar objetos. Neles irá ficar o código de acesso ao hibernate, mas creio que não é bom criar configuration e sessionfactory a cada vez que eu precisar.
Como isso é feito normalmente?
Olá
Nunca! No main só vai o mínimo possível para iniciar a aplicação.
[]s
Luca
então onde seria?
É importante você estudar um pouco mais sobre MVC para que você possa dividir sua aplicação em camadas.
Respondendo sua pergunta, você pode criar uma classe que contenha métodos para controle e manipulação dos dados usando o hibernate. Essa classe pode funcionar como um componente DAO.
http://www.onjava.com/pub/a/onjava/2004/01/14/hibernate.html
Crie uma classe DAO, ela será responsável por isso, além de ser responsável por todas as operações envovendo aplicação <–> Banco de Dados
E respondendo a outra pergunta: sim, deve criar apenas 1 sessionFactory e compartilhar a mesma para toda a aplicação. Pode fazer isso simplesmente declarando a variável como estática caso a lógica de acesso a dados fique no cliente.
Minha aplicação já é dividida em MVC. Tenho objetos de negócios como GerenciarCliente, que irão acessar o hibernate para salvar, e carregar objetos.
Quero saber quando eu devo instânciar o sessionFactory e o configuration e onde armazenar os objetos. Onde eu devo criar uma variável estática?
Tem alguma estratégia ou padrão para isso? Devo criar alguma classe que fará esse trabalho de criar o configuration e objeto session?
Nos exemplos que já vi, sempre são aplicações simples que fazem isso tudo no método main da aplicação. No manual do hibernate não diz exemplos de onde fazer isso.
Uma idéia é voce carregar o Configuration e o SessionFactory em uma classe DAO e deixar o SessionFactory como static…
esse DAO pode ser carregado quando você abrir seu sistema Swing em cada cliente
Mas em cada classe DAO eu teria a instanciação do Configuration e do SessionFactory?
Nâo seria melhor eu ter a criação do configuration em apenas 1 local e nesse local eu adicionar todos os mapeamentos das classes que serão persistidas?
Eu terei dezenas de facades no meu programa. Cada façade irá persistir algumas. O facade GerenciadorCliente irá persistir o orçamento do cliente e os itens do orçamento.
Mas, pelo que entendi, o meu GerenciadorCliente, deve usar uma Sessao que já foi criada por um sessionFactory. Seria isso? Então, no sistema teria apenas uma instância do SessionFactory e da configuration.
Então, quando eu criaria esses objetos e onde armazenaria as referências?
Você terá apenas uma classe de DAO pai, e nela seu objeto SessionFactory será estático
por exemplo
public class DAO {
protected static SessionFactory factory;
public void initialization() {
Configuration conf = new Configuration();
..........
factory = conf.buildSessionFactory();
}
}
Os Maps você pode por ae dentro, ou senão no arquivo hibernate.conf.xml, eu particularmente prefiro deixar em arquivo do que na classe…
Agora seus outros DAO, poderiam extender esse dao, por exemplo
public class DAOProdutos extends DAO {
public void insert(Produtos produtos) {
Session session = factory.getSession()...
..............
}
}
O SessionFactory vc terá apenas 1, mas o Session você inicia e fecha ele em cada operação.
Ok, obrigado. É isso que eu queria saber.
Vou só adaptar o seu exemplo ao meu caso, pois eu não uso DAO. Uso algo que será parecido com seus DAO, que são meus objetos Gerenciadores, como GerenciadorCliente.
Vou criar uma classe para fazer o papel da sua classe DAO e manter uma instância estática da factory.
Quando e por quem o initialization() será executado?
Pode ser executado quando sua aplicação Swing for iniciada…
Quanto a esse arquivo hibernate.conf.xml, eu não sei a respeito dele. Estou lendo o manual do hibernate e uma das formas de mapear foi:
Configuration cfg = new Configuration()
.addClass(org.hibernate.auction.Item.class)
.addClass(org.hibernate.auction.Bid.class);
Ainda não vi como usar o arquivo hibernate.conf.xml. Com esse arquivo fica mais fácil? Qual o procedimento para usar ele?
desculpe, o certo é hibernate.cgf.xml
vc pode ler mais aqui
http://www.hibernate.org/hib_docs/v3/reference/en/html/session-configuration.html#configuration-xmlconfig
a diferença é que se vc adicionar novas classes, nao precisa adicionar no seu Configuration, e sim nesse arquivo, eu acho melhor e mais flexivel