Ola galera antes de abrir o topico eu procurei muito aqui no forum e sites afins mas nao cheguei a uma soluçao
Uso Hibernate. 4.2.7 (mas vi q ja tem um nova atualizaçao)
É o seguinte quando vou gravar dados no Banco só posso fazer isso uma vez
se tentar gravar novamente dados (diferentes) me retorna a seguinte mensagem nested transactions not supported
como eu fecho uma transaction sem ter q fechar a session?
Tentei com o rollBack(); mas nao deu certo tbm
uma soluçao q fiz aqui foi de retirar a session do construtor da classe DAO
e inserir ela em todos os métodos, abrindo e fechando a mesma
so que dessa forma eu tenho um certo atraso(pouco mas Perceptível) ao ler e gravar no BD
Seria possivel começar uma nova transação aproveitando a mesma session que esta no construtor da classe?
Minha clase Util
private SessionFactory sessionFactory;
private ServiceRegistry serviceRegistry;
private SessionFactory getSessionFactory() {
Configuration configuration = new Configuration();
configuration.configure();
serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
return sessionFactory;
}
public Session getSession() {
sessionFactory = getSessionFactory();
return sessionFactory.openSession();
}
Minha classe DAO
public HibernateDAO() {
session = new HibernateUtil().getSession(); //Aqui retorna uma Session em cada Instancia do HibernateDAO
}
//
public void inserir(Object classe) {
Transaction t = null;
try {
t = session.beginTransaction();
session.persist(classe);
t.commit();
} catch (Exception e) {
Dialogs.create().lightweight()
.title("Erro!!!")
.masthead("Ops!! Ocorreu um erro")
.message("Detalhes")
.showException(e);
}
// t.rollback();
}
public Object selecionar(Class object, String cep) { //Uso esse metodo para consultar um CEP, sem os métodos openSession e closeSession();
//essa consulta é instantânea, pq no construtor da classe eu ja inicio a session
//openSession():
Object obj = null;
Transaction t = null;
try {
t = session.beginTransaction();
obj = session.get(object, cep);
} catch (Exception e) {
Dialogs.create().lightweight()
.title("Erro!!!")
.masthead("Ops!! Ocorreu um erro")
.message("Detalhes")
.showException(e);
} finally {
t.rollback(); // colocando o rollback aqui posso fazer varias consultas
}
return obj;
//closeSession();
}
public void openSession() {
session = new HibernateUtil().getSession();
}
public void closeSession() {
session.close();
}
Configuraçoes do Hibernate
<property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/proescola?zeroDateTimeBehavior=convertToNull</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">02041989</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>