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
Post a Comment