java - Accessing existing postgres database with ormlite -


i started writing application should use ormlite access postgresql database created. uses database scheme , domain object classes below. however, not able create new user running test method below. accessing database using classes works without problems. , exception tells me postgre not able insert:

java.sql.sqlexception: unable run insert stmt on object net.avedo.spozz.models.user@78412176: insert "users" ("id" ,"cdate" ,"mdate" ,"name" ,"email" ,"password" ,"avatar_id" ) values (?,?,?,?,?,?,?)     @ com.j256.ormlite.misc.sqlexceptionutil.create(sqlexceptionutil.java:22)     @ com.j256.ormlite.stmt.mapped.mappedcreate.insert(mappedcreate.java:135)     @ com.j256.ormlite.stmt.statementexecutor.create(statementexecutor.java:450)     @ com.j256.ormlite.dao.basedaoimpl.create(basedaoimpl.java:310)     @ net.avedo.spozz.models.usertest.testusercreation(usertest.java:178)     @ sun.reflect.nativemethodaccessorimpl.invoke0(native method)     @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:57)     @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43)     @ java.lang.reflect.method.invoke(method.java:606)     @ org.junit.runners.model.frameworkmethod$1.runreflectivecall(frameworkmethod.java:47)     @ org.junit.internal.runners.model.reflectivecallable.run(reflectivecallable.java:12)     @ org.junit.runners.model.frameworkmethod.invokeexplosively(frameworkmethod.java:44)     @ org.junit.internal.runners.statements.invokemethod.evaluate(invokemethod.java:17)     @ org.junit.internal.runners.statements.runbefores.evaluate(runbefores.java:26)     @ org.junit.internal.runners.statements.runafters.evaluate(runafters.java:27)     @ org.junit.runners.parentrunner.runleaf(parentrunner.java:271)     @ org.junit.runners.blockjunit4classrunner.runchild(blockjunit4classrunner.java:70)     @ org.junit.runners.blockjunit4classrunner.runchild(blockjunit4classrunner.java:50)     @ org.junit.runners.parentrunner$3.run(parentrunner.java:238)     @ org.junit.runners.parentrunner$1.schedule(parentrunner.java:63)     @ org.junit.runners.parentrunner.runchildren(parentrunner.java:236)     @ org.junit.runners.parentrunner.access$000(parentrunner.java:53)     @ org.junit.runners.parentrunner$2.evaluate(parentrunner.java:229)     @ org.junit.runners.parentrunner.run(parentrunner.java:309)     @ org.apache.maven.surefire.junit4.junit4provider.execute(junit4provider.java:264)     @ org.apache.maven.surefire.junit4.junit4provider.executetestset(junit4provider.java:153)     @ org.apache.maven.surefire.junit4.junit4provider.invoke(junit4provider.java:124)     @ org.apache.maven.surefire.booter.forkedbooter.invokeproviderinsameclassloader(forkedbooter.java:200)     @ org.apache.maven.surefire.booter.forkedbooter.runsuitesinprocess(forkedbooter.java:153)     @ org.apache.maven.surefire.booter.forkedbooter.main(forkedbooter.java:103) caused by: org.postgresql.util.psqlexception: error: column "cdate" of type timestamp without time zone expression of type character varying   hint: need rewrite or cast expression.   position: 100     @ org.postgresql.core.v3.queryexecutorimpl.receiveerrorresponse(queryexecutorimpl.java:2103)     @ org.postgresql.core.v3.queryexecutorimpl.processresults(queryexecutorimpl.java:1836)     @ org.postgresql.core.v3.queryexecutorimpl.execute(queryexecutorimpl.java:257)     @ org.postgresql.jdbc2.abstractjdbc2statement.execute(abstractjdbc2statement.java:512)     @ org.postgresql.jdbc2.abstractjdbc2statement.executewithflags(abstractjdbc2statement.java:388)     @ org.postgresql.jdbc2.abstractjdbc2statement.executeupdate(abstractjdbc2statement.java:334)     @ com.j256.ormlite.jdbc.jdbcdatabaseconnection.insert(jdbcdatabaseconnection.java:170)     @ com.j256.ormlite.stmt.mapped.mappedcreate.insert(mappedcreate.java:91)     ... 28 more 

so miss? , how have extend avatar class in order support bytea field avatar bytea not null?

the postgresql database scheme

create table avatars (    id bigserial primary key,    cdate timestamp not null default current_timestamp,    mdate timestamp not null default current_timestamp );  create table users (    id bigserial primary key,    cdate timestamp not null default current_timestamp,    mdate timestamp not null default current_timestamp,    name varchar(160) unique not null,    email varchar (355) unique not null,    password varchar(30) not null,    avatar_id bigint,    constraint user_avatar_id foreign key (avatar_id)       references avatars (id) match simple       on update no action on delete no action ); 

a simple test case

@test public void testusercreation() throws exception {     try {         // setup user database object, ...         dao<user, integer> userdao = getuserdao();          // ... create new user ...         user user = new user();         user.setname("andi");         user.setemail("info@avedo.net");         user.setpassword("geheim");         userdao.create(user);          // ... , query users.         list<user> userlist = userdao.query(                     userdao.querybuilder().where()              .eq("name", "andi")              .prepare());          assert.asserttrue("user creation failed.", userlist.get(0).getname().equals("andi"));         assert.asserttrue("user creation failed." + userlist.get(0).getname(), userlist.get(0).getname().equals("andi"));     } catch (sqlexception e) {         throw new exception("failed create user: " + e.getmessage());     } } 

avatar.java

@databasetable(tablename = "avatars") public class avatar {     @databasefield(generatedidsequence = "avatars_id_seq", usegetset = true)     private long id;      @databasefield(canbenull = false, defaultvalue="current_timestamp", usegetset = true)     private string cdate;      @databasefield(canbenull = false, defaultvalue="current_timestamp", usegetset = true)     private string mdate;      public avatar() {         // ormlite needs no-arg constructor      }      // getter , setter methods. } 

user.java

@databasetable(tablename = "users") public class user {     @databasefield(generatedidsequence = "users_id_seq", usegetset = true)     private long id;      @databasefield(canbenull = false, defaultvalue="current_timestamp", usegetset = true)     private string cdate;      @databasefield(canbenull = false, defaultvalue="current_timestamp", usegetset = true)     private string mdate;      @databasefield(canbenull = false, usegetset = true)     private string name;      @databasefield(canbenull = false, usegetset = true)     private string email;      @databasefield(canbenull = false, usegetset = true)     private string password;      @databasefield(columnname = "avatar_id", foreign = true, usegetset = true)     private avatar avatar;      public user() {         // ormlite needs no-arg constructor      }      // getter , setter methods. } 

i able solve problem changing attribute type of cdate , mdate string date. furthermore had remove defaultvalue , canbenull parameters @databasefield annotation. leaves me follwing class:

@databasetable(tablename = "users") public class user {     @databasefield(generatedidsequence = "users_id_seq", usegetset = true)     private long id;      @databasefield(usegetset = true)     private date cdate;      @databasefield(usegetset = true)     private date mdate;      @databasefield(canbenull = false, usegetset = true)     private string name;      @databasefield(canbenull = false, usegetset = true)     private string email;      @databasefield(canbenull = false, usegetset = true)     private string password;      @databasefield(columnname = "avatar_id", foreign = true, usegetset = true)     private avatar avatar;      public user() {         // ormlite needs no-arg constructor      }      // getter , setter methods. } 

finally, had adjust database scheme accordingly:

create table avatars (    id bigserial primary key,    cdate timestamp default current_timestamp,    mdate timestamp default current_timestamp --   avatar bytea not null );  create table users (    id bigserial primary key,    cdate timestamp default current_timestamp,    mdate timestamp default current_timestamp,    name varchar(160) not null,    email varchar (355) unique not null,    password varchar(30) not null,    avatar_id bigint,    constraint user_avatar_id foreign key (avatar_id)       references avatars (id) match simple       on update no action on delete no action ); 

in order avoid null values, set default value of cdate , mdate current_timestamp , added trigger, automatically update value of mdate if corresponding row changes:

create or replace function update_timestamp() returns trigger  $update_timestamp$     begin         new.mdate := current_timestamp;         return new;     end; $update_timestamp$  language plpgsql;  create trigger update_timestamp before insert or update on avatars     each row execute procedure update_timestamp();  create trigger update_timestamp before insert or update on users     each row execute procedure update_timestamp(); 

Comments

Popular posts from this blog

get url and add instance to a model with prefilled foreign key :django admin -

android - Keyboard hides my half of edit-text and button below it even in scroll view -

css - Make div keyboard-scrollable in jQuery Mobile? -