这是我的问题:
我有一个使用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",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; } }
解决方法
@H_404_22@ 对不起,我花了这么长时间,但这就解决了我的问题.我将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",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,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"/>
这解决了我.