2013-03-13 100 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

只需在persistence.xml中添加此 < property name =「hbm2ddl.auto」>創建</property> 。它會工作。但其他 - 比創建不工作。