HSQLDB rodando com aplicação desktop - tabelas sendo dropadas

Pessoal,

Tenho uma aplicação web rodando com o HSQLDB e funcionando perfeitamente. Utilizando as mesmas configurações da camada Dao onde uso o Hibernate, criei uma aplicação desktop, mas o que parece estar acontecendo é que a cada ciclo de vida da aplicação, o banco esta sendo dropado e criado novamente. Alguém saberia o que esta errado ?

Segue meu hibernate.cfg.xml

&lt?xml version='1.0' encoding='utf-8'?&gt
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
	
<hibernate-configuration>

	<session-factory>
	
		<property name="hibernate.dialect">org.hibernate.dialect.HSQLDialect</property>
		<property name="hibernate.connection.url">jdbc:hsqldb:file:timeIsMoneyDB</property>
		<property name="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</property>
		<property name="hibernate.connection.username">sa</property>
		<property name="hibernate.connection.password"></property>

		<property name="hibernate.generate_statistics">true</property>	
		<property name="hibernate.use_sql_comments">true</property>
		<property name="hibernate.show_sql">true</property>
		<property name="hibernate.hbm2ddl.auto">update</property>
		<property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
		
		<mapping class="model.User" />
		
	</session-factory>

</hibernate-configuration>

Abraços,

no arquivo hibernate.properties adicione a linha hibernate.hbm2ddl.auto=update caso ela já exista, apenas troque o parâmetro

Já experimentei mudá-lo para validate, mas tb não adiantou …

vou te mostrar como estou montando o meu hibernateUtil… eu tive que fazer umas modificações na versão original do hibernate.

[code]
package dao ;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;

/**

  • @netbeans.hibernate.util
    */
    public class HibernateUtil {
    private static Log log = LogFactory.getLog(HibernateUtil.class);

    private static SessionFactory sessionFactory;

    private static SessionFactory getSessionFactory() {
    try {
    if (sessionFactory == null) {
    Configuration configuration = new Configuration();
    // load all beans
    InputStream is = HibernateUtil.class.getResourceAsStream(“hibernateBeans.lst”);
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    String line ;
    while ((line = reader.readLine()) != null) {
    configuration.addResource(line);
    }
    Properties properties = new Properties();
    properties.load(HibernateUtil.class.getResourceAsStream(“hibernate.properties”));
    configuration.setProperties(properties);
    sessionFactory = configuration.buildSessionFactory();
    }

     } catch (Throwable ex) {
         log.error("Initial SessionFactory creation failed.", ex);
         throw new ExceptionInInitializerError(ex);
     }
     return  sessionFactory;
    

    }

    public static ThreadLocal session =null;

    public static Session currentSession() throws HibernateException {
    if(session==null){
    session = new ThreadLocal();
    }
    Session s = (Session) session.get();
    if (s == null) {
    s = getSessionFactory().openSession();
    session.set(s);
    }
    return s;
    }

    public static void closeSession() throws HibernateException {
    Session s = (Session) session.get();
    session.set(null);
    if (s != null)
    s.close();
    }

    public static void shutdown() {
    try{
    currentSession().beginTransaction().commit();
    currentSession().connection().createStatement().execute(“SHUTDOWN”);
    session=null;
    }catch(Exception e){
    e.printStackTrace();
    }
    }
    }[/code]

depois de fazer todoas as transações, para que elas sejam gravadas em disco, eu tenho que executar o método shutdown()

talvez ele não esteja gravando.

tira ela dai e testa :wink:

Imagino que meu problema não seja no HibernateUtil, pois o mesmo arquivo esta sendo utilizado em uma aplicação web sem problemas …

O que esta acontecendo :


public static void main(String[] args) {
		UserDao dao = new UserDao();
		User user = new User();
		user.setName("Márcio Barroso");
		user.setLogin("marcio");
		user.setPassword("12345");
		user.setLastAccess(new Date());
		dao.salvar(user);
		
		user = new User();
		user.setName("Luiz José");
		user.setLogin("luiz");
		user.setPassword("12345");
		user.setLastAccess(new Date());
		dao.salvar(user);
		
		List<User> list = dao.listar();
		for( User u : list ) {
			System.out.println(u.getId()+" "+u.getName()+" "+u.getLogin());
		}
	}

Qdo eu executo o código acima, a transação é feita com sucesso, mas qdo eu executo uma segunda vez, o resultado é o mesmo da primeira execução, qdo não deveria incluir um registro com o login repetido, pois este atributo é unique=true … e os id’s são sempre 1 e 2.

O que me parece é q a cada build da sessionfactory o banco esta sendo criado novamente …

Você está usando o banco em arquivo ou como server ?

Já tentei isso tb … sem sucesso :frowning:

oi pessal, cara na string de conexão coloca shutdown=true

Como ficaria esta string de conexão ??? Como abaixo ???

<property name="hibernate.connection.url">jdbc:hsqldb:file:timeIsMoneyDB:shutdown=true</property>

[]'s

sim seria isso mesmo…flw

Resolvido … obrigado

OK :smiley: