Sleipbr
Novembro 17, 2012, 7:56pm
#1
Essa maneira de instancia apenas uma vez o sessionfactory esta correto?
[code]package DAOS;
import org.hibernate.;
import org.hibernate.cfg. ;
public final class HibernateUtil
{
private static SessionFactory sessionFactory;
public static SessionFactory getSessionFactory() throws MappingException
{
if(sessionFactory == null) {
sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
}
return sessionFactory;
}
public static Session getSession()
{
return getSessionFactory().openSession();
}
} [/code]
[code]public class FornecedorDAO {
public void cadastroFornecedor(String nomeEmpresa,String nomeContato,String cargoContato,String rua,String complemento,int cidade,String bairro,String cep,String email,String celular,String telefone,String cnpj,String obs) {
try {
HibernateUtil.getSessionFactory();
Session sessao = HibernateUtil.getSession();
Fornecedor fornecedor = new Fornecedor();
fornecedor.setNomeContato(nomeContato);
fornecedor.setCargoContato(cargoContato);
fornecedor.setNomeEmpresa(nomeEmpresa);
fornecedor.setCnpj(cnpj);
fornecedor.setCidade(cidade);
fornecedor.setRua(rua);
fornecedor.setBairro(bairro);
fornecedor.setCep(cep);
fornecedor.setComplemento(complemento);
fornecedor.setEmail(email);
fornecedor.setCelular(celular);
fornecedor.setFone(telefone);
fornecedor.setObs(obs);
Transaction forn = sessao.beginTransaction();
sessao.save(fornecedor);
forn.commit();
sessao.close();
}catch(Exception err) {
JOptionPane.showMessageDialog(null, "Erro na inserção "+err);
}
}
}[/code]
No NetBeans 7.2.1 quando vc cria um HibernateUtil.java o resultado é:
[code] public class HibernateUtil {
private static final SessionFactory sessionFactory;
static {
try {
// Create the SessionFactory from standard (hibernate.cfg.xml)
// config file.
sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
} catch (Throwable ex) {
// Log the exception.
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}[/code]
No entanto, o pacote org.hibernate.cfg.AnnotationConfiguration está Deprecated na versão 4 do hibernate.
Eu não sei se é o ideal (provavelmente não é), mas estou fazendo isso:
public class HibernateUtil {
private static SessionFactory sessionFactory;
public static void setSessionFactory(SessionFactory sessionFactory){
HibernateUtil.sessionFactory=sessionFactory;
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
A atribuição da sessionFactory eu faço através de injeção de depedência.
Também gostaria de saber uma forma mais adequada.
Meu hibernate util é assim, uso hibernate 4 com classes anotadas:
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
public class HibernateUtil {
private static SessionFactory factory;
static {
Configuration cfg = new Configuration(); // Nao preciso chamar .configure(), porque nao uso hibernate.cfg.xml, uso hibernate.properties
cfg.addAnnotatedClass(LoginTO.class); // Aqui coloco as classes que tem as anotacoes
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
factory = cfg.buildSessionFactory(serviceRegistry);
}
public static Session getSession() {
return factory.openSession();
}
}
Tinha lido algo sobre esse ServiceRegistry falando que era a nova forma de inicializar a SessionFactory, mas não tinha entendido muito bem a idéia. Mas não sei se consigo aplicá-la no meu projeto.
Vou ter que ler mais sobre a instanciação do configuration que você faz na linha 13, porque eu já adiciono todas as classes anotadas no applicationContext.xml, então o que você faz na linha 14 não é válido pra mim.
Mas de qualquer forma, deu pra entender melhor o propósito da utilização do ServiceRegistry.
applicationContext.xml ? Spring ?
se voce usa spring, voce nao precisa nada de hibernate.cfg nem hibernate.properties, o proprio spring cuida disso pra voce.
Pois é… como disse. Eu instancio o SessionFactory pelo Spring. Só que não sei se essa é a forma ideal.
public class HibernateUtil {
private static SessionFactory sessionFactory;
public static void setSessionFactory(SessionFactory sessionFactory){
HibernateUtil.sessionFactory=sessionFactory;
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
Nunca é tarde pra tentar =D
Testa ae ne ^^
rof20004 …
Como você mapeia o hibernate.properties ???
E você coloca ele em qualquer pacote ??
Poderia por ele também aqui ???
[quote=fernandotnl]Pois é… como disse. Eu instancio o SessionFactory pelo Spring. Só que não sei se essa é a forma ideal.
[code]
public class HibernateUtil {
private static SessionFactory sessionFactory;
public static void setSessionFactory(SessionFactory sessionFactory){
HibernateUtil.sessionFactory=sessionFactory;
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
[/code][/quote]
Se você usa Spring Framework, a maneira correta é utilizar o Spring Framework para gerenciar o Hibernate.
[quote=MarcolaLipe10]rof20004 …
Como você mapeia o hibernate.properties ???
E você coloca ele em qualquer pacote ??
Poderia por ele também aqui ???[/quote]
O hibernate.properties fica na pasta src, sobre postar ele aqui, nem precisa, voce so coloca nele as configuracoes do hibernate, segue exemplo:
hibernate.connection.url = jdbc:postgresql://localhost:5432/banco
hibernate.dialect = org.postgresql.Dialect
.....
E por ai vai, isso e so um exemplo, acho que coloquei alguma coisa errada, hehehehehe…flw
Ajudo muito não … UHUAHUAHAUHA
Aonde eu mapeio ele se eu nao vou usar o .configuration() … ???
E eu nao tenho ele , se você poder me enviar por email … agradeco !
[quote=rof20004]Meu hibernate util é assim, uso hibernate 4 com classes anotadas:
[code]
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
public class HibernateUtil {
private static SessionFactory factory;
static {
Configuration cfg = new Configuration(); // Nao preciso chamar .configure(), porque nao uso hibernate.cfg.xml, uso hibernate.properties
cfg.addAnnotatedClass(LoginTO.class); // Aqui coloco as classes que tem as anotacoes
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
factory = cfg.buildSessionFactory(serviceRegistry);
}
public static Session getSession() {
return factory.openSession();
}
}
[/code][/quote]
Voce mapeia ele no seu HibernateUtil mano, como falei ali em cima.
rof20004 …
Eu andei estudando sobre o HibernateUtil , vc declara a classe no HibernateUtil … ???
Eu ultilizo o hibernate-cfg.xml e eu gostaria de ter um HibernateUtil 4 final !
é só você fazer como está na ultima mensagem, cria uma classe chamada HibernateUtil e configura da mesma forma. E cria um arquivo chamado hibernate.properties com os dados da conexão.
Mas você está mapeando a classe no HibernateUtil msmo ???
Respectiva ordens hibernate-cfg.xml e HibernateUtil …
Sendo que meu HibernateUtil, não tem factory
[code]<?xml version="1.0" encoding="UTF-8"?>
org.hibernate.dialect.MySQLDialect
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">marcos</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping class="entity.Pessoa"/>
[/code]
[code]public class HibernateUtil {
private static final SessionFactory sessionFactory;
private static final ThreadLocal session = new ThreadLocal();
static{
try {
Configuration config = new Configuration().configure();
ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
sessionFactory = config.buildSessionFactory(sr);
} catch (Throwable ex) {
ex.printStackTrace();
System.err.println("Initial SessionFactory creation failed." +ex);
throw new ExceptionInInitializerError(ex);
}
}
public static Session getCurrentSession(){
Session s = (Session) session.get();
if(s == null || !s.isOpen()){
s = sessionFactory.openSession();
}
session.set(s);
return s;
}
public static void closeSession(){
Session s = (Session) session.get();
if(s != null || s.isOpen()){
s.close();
}
session.set(s);
}
public static void main(String[] args) {
Session session = HibernateUtil.getCurrentSession();
}
}[/code]
Respectiva ordens hibernate-cfg.xml e HibernateUtil …
Sendo que meu HibernateUtil, não tem factory
[code]<?xml version="1.0" encoding="UTF-8"?>
org.hibernate.dialect.MySQLDialect
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">marcos</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping class="entity.Pessoa"/>
[/code]
[code]public class HibernateUtil {
private static final SessionFactory sessionFactory;
private static final ThreadLocal session = new ThreadLocal();
static{
try {
Configuration config = new Configuration().configure();
ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
sessionFactory = config.buildSessionFactory(sr);
} catch (Throwable ex) {
ex.printStackTrace();
System.err.println("Initial SessionFactory creation failed." +ex);
throw new ExceptionInInitializerError(ex);
}
}
public static Session getCurrentSession(){
Session s = (Session) session.get();
if(s == null || !s.isOpen()){
s = sessionFactory.openSession();
}
session.set(s);
return s;
}
public static void closeSession(){
Session s = (Session) session.get();
if(s != null || s.isOpen()){
s.close();
}
session.set(s);
}
public static void main(String[] args) {
Session session = HibernateUtil.getCurrentSession();
}
}[/code]
Respectiva ordens hibernate-cfg.xml e HibernateUtil …
Sendo que meu HibernateUtil, não tem factory
[code]<?xml version="1.0" encoding="UTF-8"?>
org.hibernate.dialect.MySQLDialect
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">marcos</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping class="entity.Pessoa"/>
[/code]
[code]public class HibernateUtil {
private static final SessionFactory sessionFactory;
private static final ThreadLocal session = new ThreadLocal();
static{
try {
Configuration config = new Configuration().configure();
ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
sessionFactory = config.buildSessionFactory(sr);
} catch (Throwable ex) {
ex.printStackTrace();
System.err.println("Initial SessionFactory creation failed." +ex);
throw new ExceptionInInitializerError(ex);
}
}
public static Session getCurrentSession(){
Session s = (Session) session.get();
if(s == null || !s.isOpen()){
s = sessionFactory.openSession();
}
session.set(s);
return s;
}
public static void closeSession(){
Session s = (Session) session.get();
if(s != null || s.isOpen()){
s.close();
}
session.set(s);
}
public static void main(String[] args) {
Session session = HibernateUtil.getCurrentSession();
}
}[/code]
A muito tempo que nao trabalho mais dessa forma, mas vamos la.
Voce cria um arquivo hibernate.properties na pasta src do seu projeto.
Voce define as configuracoes de conexoes do hibernate neste .properties
HibernateUtil não é um arquivo de configuração, e sim uma classe .java
Ficou mais claro ?
Abraços.
Poderia demonstrar um mapeamento com uma entity Pessoa !
Igual como eu fiz com o meu
O que teria nesse properties e tudo mais ???
Eu uso desse jeito que eu mostrei, nunca deu erro !
Mas gostaria de ultilizar o padrão, pois estou pensando em participar de open-sources =)
Nesse proprio topico, se voce ler desde o inicio, voce vai entender =D