Problema ao usar o hibernate com sqlite

3 respostas
W

Olá amigos do GUJ, já faz um tempo que tento usar o hibernate com o sqlite, mas sem muito sucesso. A aplicação roda sem problemas com o mysql, só que estou querendo testá-la com o sqlite. Pesquisando na internet vi que precisava de uma classe do dialect que não tem no hibernate, baixei uma mas está com um erro. pesquisei novamente e encontrei outra. baixei esta classe e coloquei no projeto. após isso rodou mas rodando com o comando create, se coloco o comando update dá a seguinte excessao:

Além da excessao segue as duas classes do dialect e também algumas outras do projeto. se alguém puder ajudar desde já agradeço.

0 [AWT-EventQueue-0] INFO  org.hibernate.annotations.common.Version - HCANN000001: Hibernate Commons Annotations {4.0.0.CR2}
24 [AWT-EventQueue-0] INFO  org.hibernate.Version - HHH000412: Hibernate Core {4.0.0.CR4}
27 [AWT-EventQueue-0] INFO  org.hibernate.cfg.Environment - HHH000206: hibernate.properties not found
29 [AWT-EventQueue-0] INFO  org.hibernate.cfg.Environment - HHH000021: Bytecode provider name : javassist
866 [AWT-EventQueue-0] INFO  org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl - HHH000402: Using Hibernate built-in connection pool (not for production use!)
876 [AWT-EventQueue-0] INFO  org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl - HHH000115: Hibernate connection pool size: 20
877 [AWT-EventQueue-0] INFO  org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl - HHH000006: Autocommit mode: true
877 [AWT-EventQueue-0] INFO  org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl - HHH000401: using driver [org.sqlite.JDBC] at URL [jdbc:sqlite:BANCO_DE_CONTAS.db]
878 [AWT-EventQueue-0] INFO  org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl - HHH000046: Connection properties: {user=, password=****, autocommit=true, release_mode=auto}
1043 [AWT-EventQueue-0] INFO  org.hibernate.dialect.Dialect - HHH000400: Using dialect: org.hibernate.dialect.SQLiteDialect
1060 [AWT-EventQueue-0] INFO  org.hibernate.engine.jdbc.internal.LobCreatorBuilder - HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [2] less than 4
1076 [AWT-EventQueue-0] INFO  org.hibernate.engine.transaction.internal.TransactionFactoryInitiator - HHH000268: Transaction strategy: org.hibernate.engine.transaction.internal.jdbc.JdbcTransactionFactory
1085 [AWT-EventQueue-0] INFO  org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory - HHH000397: Using ASTQueryTranslatorFactory
1458 [AWT-EventQueue-0] INFO  org.hibernate.tool.hbm2ddl.SchemaUpdate - HHH000228: Running hbm2ddl schema update
1458 [AWT-EventQueue-0] INFO  org.hibernate.tool.hbm2ddl.SchemaUpdate - HHH000102: Fetching database metadata
1460 [AWT-EventQueue-0] INFO  org.hibernate.tool.hbm2ddl.SchemaUpdate - HHH000396: Updating schema
1467 [AWT-EventQueue-0] WARN  org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 0, SQLState: null
1467 [AWT-EventQueue-0] ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - not yet implemented
1469 [AWT-EventQueue-0] ERROR org.hibernate.tool.hbm2ddl.SchemaUpdate - HHH000299: Could not complete schema update
org.hibernate.exception.GenericJDBCException: could not get table metadata: TAB_CONTASPAGAR
	at org.hibernate.exception.internal.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:148)
	at org.hibernate.exception.internal.SQLStateConverter.convert(SQLStateConverter.java:136)
	at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:124)
	at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109)
	at org.hibernate.tool.hbm2ddl.DatabaseMetadata.getTableMetadata(DatabaseMetadata.java:128)
	at org.hibernate.cfg.Configuration.generateSchemaUpdateScript(Configuration.java:1126)
	at org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(SchemaUpdate.java:212)
	at org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(SchemaUpdate.java:178)
	at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:443)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1723)
	at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:76)
	at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:907)
	at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:887)
	at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47)
	at org.wellington.contaspagar.conexao.ConexaoDB.<init>(ConexaoDB.java:12)
	at org.wellington.contaspagar.repositorio.ContasPagarRepositorio.<init>(ContasPagarRepositorio.java:24)
	at org.wellington.contaspagar.controller.ContasPagarControle.<init>(ContasPagarControle.java:18)
	at org.wellington.contaspagar.gui.ContasPagarUI.<init>(ContasPagarUI.java:53)
	at org.wellington.contaspagar.gui.ContasPagarUI$12.run(ContasPagarUI.java:403)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705)
	at java.awt.EventQueue.access$000(EventQueue.java:101)
	at java.awt.EventQueue$3.run(EventQueue.java:666)
	at java.awt.EventQueue$3.run(EventQueue.java:664)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:675)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: java.sql.SQLException: not yet implemented
	at org.sqlite.MetaData.getImportedKeys(MetaData.java:503)
	at org.hibernate.tool.hbm2ddl.TableMetadata.initForeignKeys(TableMetadata.java:161)
	at org.hibernate.tool.hbm2ddl.TableMetadata.<init>(TableMetadata.java:59)
	at org.hibernate.tool.hbm2ddl.DatabaseMetadata.getTableMetadata(DatabaseMetadata.java:113)
	... 30 more

O arquivo persitence

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
  <persistence-unit name="BANCO_DE_CONTAS" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>org.wellington.contaspagar.modelo.Contaspagar</class>
    <properties>
      <property name="hibernate.connection.username" value=""/>
      <property name="hibernate.connection.driver_class" value="org.sqlite.JDBC"/>
      <property name="hibernate.connection.password" value=""/>
      <property name="hibernate.connection.url" value="jdbc:sqlite:BANCO_DE_CONTAS.db"/>
      <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
      <property name="hibernate.hbm2ddl.auto" value="update"/>
      <property name="hibernate.dialect" value="org.hibernate.dialect.SQLiteDialect"/>
   	<property name="hibernate.show_sql" value="true"/>
    </properties>
  </persistence-unit>
</persistence>
Essa é a que baixei na segunda vez e é a que estou usando
package org.hibernate.dialect;

import org.hibernate.dialect.Dialect;

public class SQLiteDialect extends Dialect{

   public SQLiteDialect()
   {
      registerColumnType(java.sql.Types.BINARY, "BLOB");
      registerColumnType(java.sql.Types.TINYINT, "INTEGER(1)");
      registerColumnType(java.sql.Types.SMALLINT, "INTEGER(2)");
      registerColumnType(java.sql.Types.INTEGER, "INTEGER(4)");
      registerColumnType(java.sql.Types.BIGINT, "INTEGER(8)");
      registerColumnType(java.sql.Types.BIT, "INTEGER(1)");
      registerColumnType(java.sql.Types.BOOLEAN, "INTEGER(1)");
      registerColumnType(java.sql.Types.DECIMAL, "REAL");
      registerColumnType(java.sql.Types.DOUBLE, "REAL");
      registerColumnType(java.sql.Types.FLOAT, "REAL");
      registerColumnType(java.sql.Types.CHAR, "TEXT(1)");
      registerColumnType(java.sql.Types.VARCHAR, "TEXT($l)");
      registerColumnType(java.sql.Types.CLOB, "TEXT");
      registerColumnType(java.sql.Types.BLOB, "BLOB");
      registerColumnType(java.sql.Types.DATE, "DATETIME");
      registerColumnType(java.sql.Types.TIME, "DATETIME");
      registerColumnType(java.sql.Types.NULL, "NULL");
   }

   @Override
   public String getIdentitySelectString()
   {
      return "SELECT last_insert_rowid()";
   }

   @Override
   public String appendIdentitySelectToInsert(String insertSql)
   {
      return insertSql + "; " + getIdentitySelectString();
   }

   @Override
   public  boolean hasAlterTable()
   {
       return false;
   }

   @Override
   public boolean dropConstraints()
   {
      return false;
   }

   @Override
   public String getForUpdateString()
   {
      return "";
   }

   @Override
   public boolean supportsSubselectAsInPredicateLHS()
   {
   // TODO: try it, at nhibernate's original code says:
        // SQLite actually does support subselects, but gives syntax errors
   // in tests. Need to investigate this.
      return false;
   }
}
Esta é a que baixei na primeira vez e é a que está dando erro
/*
 * The author disclaims copyright to this source code.  In place of
 * a legal notice, here is a blessing:
 * 
 *    May you do good and not evil.
 *    May you find forgiveness for yourself and forgive others.
 *    May you share freely, never taking more than you give.
 *
 */
package org.hibernate.dialect;

import java.sql.Types;

import org.hibernate.dialect.function.StandardSQLFunction;
import org.hibernate.dialect.function.SQLFunctionTemplate;
import org.hibernate.dialect.function.VarArgsSQLFunction;
import org.hibernate.Hibernate;

public class SQLiteDialect extends Dialect {
  public SQLiteDialect() {
    registerColumnType(Types.BIT, "integer");
    registerColumnType(Types.TINYINT, "tinyint");
    registerColumnType(Types.SMALLINT, "smallint");
    registerColumnType(Types.INTEGER, "integer");
    registerColumnType(Types.BIGINT, "bigint");
    registerColumnType(Types.FLOAT, "float");
    registerColumnType(Types.REAL, "real");
    registerColumnType(Types.DOUBLE, "double");
    registerColumnType(Types.NUMERIC, "numeric");
    registerColumnType(Types.DECIMAL, "decimal");
    registerColumnType(Types.CHAR, "char");
    registerColumnType(Types.VARCHAR, "varchar");
    registerColumnType(Types.LONGVARCHAR, "longvarchar");
    registerColumnType(Types.DATE, "date");
    registerColumnType(Types.TIME, "time");
    registerColumnType(Types.TIMESTAMP, "timestamp");
    registerColumnType(Types.BINARY, "blob");
    registerColumnType(Types.VARBINARY, "blob");
    registerColumnType(Types.LONGVARBINARY, "blob");
    // registerColumnType(Types.NULL, "null");
    registerColumnType(Types.BLOB, "blob");
    registerColumnType(Types.CLOB, "clob");
    registerColumnType(Types.BOOLEAN, "integer");


   //O erro é nessas 4 linhas abaixo. mais especificamente apois o  Hibernate.
    //( Hibernate.STRING, "", "||", "") ,  Hibernate.INTEGER, "?1 % ?2" ), ("substr", Hibernate.STRING), ( "substr", Hibernate.STRING )
    registerFunction( "concat", new VarArgsSQLFunction(Hibernate.STRING, "", "||", "") );
    registerFunction( "mod", new SQLFunctionTemplate( Hibernate.INTEGER, "?1 % ?2" ) );
    registerFunction( "substr", new StandardSQLFunction("substr", Hibernate.STRING) );
    registerFunction( "substring", new StandardSQLFunction( "substr", Hibernate.STRING ) );
  }

  public boolean supportsIdentityColumns() {
    return true;
  }

  /*
  public boolean supportsInsertSelectIdentity() {
    return true; // As specify in NHibernate dialect
  }
  */

  public boolean hasDataTypeInIdentityColumn() {
    return false; // As specify in NHibernate dialect
  }

  /*
  public String appendIdentitySelectToInsert(String insertString) {
    return new StringBuffer(insertString.length()+30). // As specify in NHibernate dialect
      append(insertString).
      append("; ").append(getIdentitySelectString()).
      toString();
  }
  */

  public String getIdentityColumnString() {
    // return "integer primary key autoincrement";
    return "integer";
  }

  public String getIdentitySelectString() {
    return "select last_insert_rowid()";
  }

  public boolean supportsLimit() {
    return true;
  }

  protected String getLimitString(String query, boolean hasOffset) {
    return new StringBuffer(query.length()+20).
      append(query).
      append(hasOffset ? " limit ? offset ?" : " limit ?").
      toString();
  }

  public boolean supportsTemporaryTables() {
    return true;
  }

  public String getCreateTemporaryTableString() {
    return "create temporary table if not exists";
  }

  public boolean dropTemporaryTableAfterUse() {
    return false;
  }

  public boolean supportsCurrentTimestampSelection() {
    return true;
  }

  public boolean isCurrentTimestampSelectStringCallable() {
    return false;
  }

  public String getCurrentTimestampSelectString() {
    return "select current_timestamp";
  }

  public boolean supportsUnionAll() {
    return true;
  }

  public boolean hasAlterTable() {
    return false; // As specify in NHibernate dialect
  }

  public boolean dropConstraints() {
    return false;
  }

  public String getAddColumnString() {
    return "add column";
  }

  public String getForUpdateString() {
    return "";
  }

  public boolean supportsOuterJoinForUpdate() {
    return false;
  }

  public String getDropForeignKeyString() {
    throw new UnsupportedOperationException("No drop foreign key syntax supported by SQLiteDialect");
  }

  public String getAddForeignKeyConstraintString(String constraintName,
      String[] foreignKey, String referencedTable, String[] primaryKey,
      boolean referencesPrimaryKey) {
    throw new UnsupportedOperationException("No add foreign key syntax supported by SQLiteDialect");
  }

  public String getAddPrimaryKeyConstraintString(String constraintName) {
    throw new UnsupportedOperationException("No add primary key syntax supported by SQLiteDialect");
  }

  public boolean supportsIfExistsBeforeTableName() {
    return true;
  }

  public boolean supportsCascadeDelete() {
    return false;
  }
}

3 Respostas

H

Se não me engano Hibernate e sqlite não se dão bem mesmo

H


http://www.wedebug.it/2011/09/28/hibernatejpa-com-sqlite/
http://code.google.com/p/hibernate-sqlite/

W

A primeira classe a qual está com erro eu peguei aqui:
http://www.wedebug.it/2011/09/28/hibernatejpa-com-sqlite/

Criado 12 de julho de 2012
Ultima resposta 12 de jul. de 2012
Respostas 3
Participantes 2