2013-03-13 9 views
5

Вот моя проблема:Hibernate + SQLite не создает базу данных

У меня есть приложение на рабочем столе с помощью JavaFX + Hibernate + SQLite. Это моя модель:

@Entity 
@Table(name = "usuario") 
public class Usuario implements AbstractModel, Serializable { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer id; 

    @NotNull @Size(min=5, max=100) 
    private String username; 

    @NotNull @Size(min=5, max=100) 
    private String password; 

    @NotNull 
    private Boolean administrador; 

    @Version 
    private Integer version; 

    public Usuario() { 
    } 

    public Usuario(Integer id, String username, String password, Boolean admin, Integer version) { 
     this.id = id; 
     this.username = username; 
     this.password = password; 
     this.administrador = admin; 
     this.version = version; 
    } 

    @Override 
    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPasword(String password) { 
     this.password = password; 
    } 

    public Boolean getAdministrador() { 
     return administrador; 
    } 

    public void setAdministrador(Boolean administrador) { 
     this.administrador = administrador; 
    } 

    public Integer getVersion() { 
     return version; 
    } 

Это мой persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.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_2_0.xsd"> 
    <persistence-unit name="PartyRockPU" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <class>br.com.gear7.partyrock.model.Usuario</class> 

    <properties> 
     <property name="javax.persistence.jdbc.driver" value="org.sqlite.JDBC" /> 
     <property name="javax.persistence.jdbc.url" value="jdbc:sqlite:party_rock.sqlite" /> 
     <property name="javax.persistence.jdbc.user" value="" /> 
     <property name="javax.persistence.jdbc.password" value="" /> 

     <property name="hibernate.dialect" value="br.com.gear7.partyrock.utils.SQLiteDialect"/> 
     <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/> 
     <property name="hibernate.connection.charSet" value="UTF-8"/> 
     <property name="hibernate.hbm2ddl.auto" value="create-drop"/> 
    </properties> 
    </persistence-unit> 
</persistence> 

И, наконец, это мой SQLiteDialect

> package br.com.gear7.partyrock.utils; 
/* 
* 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. 
* 
*/ 
import java.sql.Types; 

import org.hibernate.dialect.Dialect; 
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() { 
     super(); 
     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"); 

     registerFunction("concat", new VarArgsSQLFunction(org.hibernate.type.StandardBasicTypes.STRING, "", 
       "||", "")); 
     registerFunction("mod", new SQLFunctionTemplate(org.hibernate.type.StandardBasicTypes.INTEGER, 
       "?1 % ?2")); 
     registerFunction("substr", new StandardSQLFunction("substr", 
       org.hibernate.type.StandardBasicTypes.STRING)); 
     registerFunction("substring", new StandardSQLFunction("substr", 
       org.hibernate.type.StandardBasicTypes.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; 
    } 

    public 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 часов и не может найти решения для этого.

+0

У меня также есть такая же проблема, вы нашли решение? – Ha11owed

+0

, какую платформу вы использовали для написания кода и версии? –

+0

Наконец-то вы решили проблему? Если да, можете ли вы поделиться решением? Благодарю. –

ответ

3

Мне жаль, что меня так долго не хватало, но вот что решило проблему для меня. Я изменил файл DIALECT на лучший, который нашел.

package gear7.partyrock.utils; 

/* 
* 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. 
* 
*/ 

import java.sql.Types; 
import org.hibernate.dialect.Dialect; 

import org.hibernate.dialect.function.AbstractAnsiTrimEmulationFunction; 
import org.hibernate.dialect.function.NoArgSQLFunction; 
import org.hibernate.dialect.function.SQLFunction; 
import org.hibernate.dialect.function.SQLFunctionTemplate; 
import org.hibernate.dialect.function.StandardSQLFunction; 
import org.hibernate.dialect.function.VarArgsSQLFunction; 
import org.hibernate.type.StandardBasicTypes; 

public class SQLiteDialect extends Dialect { 
    public SQLiteDialect() { 
    registerColumnType(Types.BIT, "boolean"); 
    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($p, $s)"); 
    registerColumnType(Types.DECIMAL, "decimal"); 
    registerColumnType(Types.CHAR, "char"); 
    registerColumnType(Types.VARCHAR, "varchar($l)"); 
    registerColumnType(Types.LONGVARCHAR, "longvarchar"); 
    registerColumnType(Types.DATE, "date"); 
    registerColumnType(Types.TIME, "time"); 
    registerColumnType(Types.TIMESTAMP, "datetime"); 
    registerColumnType(Types.BINARY, "blob"); 
    registerColumnType(Types.VARBINARY, "blob"); 
    registerColumnType(Types.LONGVARBINARY, "blob"); 
    registerColumnType(Types.BLOB, "blob"); 
    registerColumnType(Types.CLOB, "clob"); 
    registerColumnType(Types.BOOLEAN, "boolean"); 

    //registerFunction("abs", new StandardSQLFunction("abs")); 
    registerFunction("concat", new VarArgsSQLFunction(StandardBasicTypes.STRING, "", "||", "")); 
    //registerFunction("length", new StandardSQLFunction("length", StandardBasicTypes.LONG)); 
    //registerFunction("lower", new StandardSQLFunction("lower")); 
    registerFunction("mod", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "?1 % ?2")); 
    registerFunction("quote", new StandardSQLFunction("quote", StandardBasicTypes.STRING)); 
    registerFunction("random", new NoArgSQLFunction("random", StandardBasicTypes.INTEGER)); 
    registerFunction("round", new StandardSQLFunction("round")); 
    registerFunction("substr", new StandardSQLFunction("substr", StandardBasicTypes.STRING)); 
    registerFunction("substring", new SQLFunctionTemplate(StandardBasicTypes.STRING, "substr(?1, ?2, ?3)")); 
    registerFunction("trim", new AbstractAnsiTrimEmulationFunction() { 
     protected SQLFunction resolveBothSpaceTrimFunction() { 
      return new SQLFunctionTemplate(StandardBasicTypes.STRING, "trim(?1)"); 
     } 

     protected SQLFunction resolveBothSpaceTrimFromFunction() { 
      return new SQLFunctionTemplate(StandardBasicTypes.STRING, "trim(?2)"); 
     } 

     protected SQLFunction resolveLeadingSpaceTrimFunction() { 
      return new SQLFunctionTemplate(StandardBasicTypes.STRING, "ltrim(?1)"); 
     } 

     protected SQLFunction resolveTrailingSpaceTrimFunction() { 
      return new SQLFunctionTemplate(StandardBasicTypes.STRING, "rtrim(?1)"); 
     } 

     protected SQLFunction resolveBothTrimFunction() { 
      return new SQLFunctionTemplate(StandardBasicTypes.STRING, "trim(?1, ?2)"); 
     } 

     protected SQLFunction resolveLeadingTrimFunction() { 
      return new SQLFunctionTemplate(StandardBasicTypes.STRING, "ltrim(?1, ?2)"); 
     } 

     protected SQLFunction resolveTrailingTrimFunction() { 
      return new SQLFunctionTemplate(StandardBasicTypes.STRING, "rtrim(?1, ?2)"); 
     } 
    }); 
    //registerFunction("upper", new StandardSQLFunction("upper")); 
    } 

    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; 
    } 

    public boolean bindLimitParametersInReverseOrder() { 
    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 true; // TODO Validate 
    } 

    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 true; 
    } 

    /* not case insensitive for unicode characters by default (ICU extension needed) 
    public boolean supportsCaseInsensitiveLike() { 
    return true; 
    } 
    */ 

    public boolean supportsTupleDistinctCounts() { 
    return false; 
    } 

    public String getSelectGUIDString() { 
    return "select hex(randomblob(16))"; 
    } 
} 

И я изменил эту линию на моем persistence.xml

<property name="hibernate.hbm2ddl.auto" value="update"/> 

Это решало для меня. :)

0

Когда вы запускаете свой код, вы можете хранить вещи в базе данных?

Глядя на ваш persistence.xml Я могу видеть <property name="hibernate.hbm2ddl.auto" value="create-drop"/>, который создаст БД при запуске спящего режима, а затем удалит его, когда спящий режим выключится. Легко было бы, что БД создается, но Hibernate, удаляющий БД, удаляет его.

+0

Я уже пробовал с созданием-обновлением, обновлением, проверкой, созданием и другими возможными значениями. – renatojf

0

Просто добавьте имени < свойства = "hbm2ddl.auto"> создать </недвижимости> в persistence.xml. Это будет работать. Но другое, чем создание, не работает.