The problem was stupid, of course:)
I used update method instead of insert method for insert mapped statement
( according to jPetstore 4.05)
By the way,
Postgresql 8 allows to execute two dml operations in one sql map statement +
<selectKey>. It makes it much easier to write.
Thanks, a lot
Darek
>
> I hooked up pgsql to the jgamestore app and ran the unit test against
> the following sql map. It worked fine and populated the id just fine.
> I think the key is to specify your jdbc types in the mapping
> (#myInteger:INTEGER#).
>
> <insert id="insert" parameterClass="Category">
> <selectKey keyProperty="categoryId" resultClass="integer">
> SELECT nextval('global_seq')
> </selectKey>
> INSERT INTO CATEGORY
> (
> categoryId,
> title,
> description,
> parentCategoryId,
> leftNode,
> rightNode,
> sequence,
> ancestorTree
> )
> VALUES(
> #categoryId:INTEGER#,
> #title:VARCHAR#,
> #description:VARCHAR#,
> #parentCategoryId:INTEGER#,
> #leftNode:INTEGER#,
> #rightNode:INTEGER#,
> #sequence:INTEGER#,
> #ancestorTree:VARCHAR#
> )
> </insert>
>
> Brandon
>
> On 5/1/05, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote:
> > Hi,
> > Unfortunately, It still doesn't work. After many of combinations I
forgot
> to put it, but it doesn't change anything at all.
> >
> > > The selectKey will simply retrieve the id and populate the addressId
> > >in your Customer object. It is then your responsibility to insert the
> > >proper id along with your insert.
> >
> > Exactly. So when I put the <selectKey>..</selectKey> statement. While
> invocation it should be executed
> > exactly in the order pointed by positions/statements in
> <insert>..</insert>. So if I put property addressId into insert clause or
> not, it should be populated first????
> >
> > So First property addressId should be populated (I should see it in
> database log file, but i cannot, see below). It still isn't executed.
> > Then insert should do the rest with correctly addressId populated.
> > The other way is to do insert ( from sequence) and catch inserted id
with
> <selectKey> using currval instead of nextval after inserting record into
> table.
> > It also isn't executed.
> >
> > Maybe there is a problem between that, the database column addr_id is
type
> of integer, and my resultClass is int (bean has Integer property). But I
> also tried resultClass as resultClass="integer". Nothing changed.
> >
> > Then I relised that the addressId is set to 0 (by struts), and It coulbe
> the problem, that SelectKey maybe is executed when
> > property is null (I removed it from form, so it was null). But It also
> didn't changed anything
> >
> > At the end of mail, ther's a mention about failure of updating id
column:
> > "Failed to update - id [insertCustomerNew] - parameterObject ..."
> > Why addressId isn't mentioned. I also have id column which is extended
> from ObjectData, but it doesn't seem to be populated.
> >
> > I still hope, You can help me
> >
> > Darek
> >
> > <insert id="insertCustomerNew" parameterClass="customer">
> > <selectKey resultClass="int" keyProperty="addressId">
> > select nextval('public.addresses_addr_id_seq'::text)
> > </selectKey>
> > INSERT INTO ADDRESSES (
> > ADDR_ID
> > ,STREET
> > ,PLACENO
> > ,FLATNO
> > ,CITY
> > ,ZIP
> > ,C_STREET
> > ,C_PLACENO
> > ,C_FLATNO
> > ,C_CITY
> > ,C_ZIP
> > )
> > VALUES (
> > #addressId#
> > ,#addressStreet#
> > ,#addressPlaceNo#
> > ,#addressFlatNo#
> > ,#addressCity#
> > ,#addressPostalCode#
> > ,#addressCstreet#
> > ,#addressCplaceNo#
> > ,#addressCflatNo#
> > ,#addressCcity#
> > ,#addressCpostalCode#
> > )
> > </insert>
> >
> > Bean of customerData known as customer parameter Class
> > public class CustomerData extends ObjectData {
> >
> > private Integer stateId;
> > private Integer compId;
> >
> > private Integer addressId;
> > ....
> >
> > public Integer getAddressId() {
> > System.out.println("getaddressId" + addressId);
> > return addressId;
> > }
> >
> > public void setAddressId(Integer addressId) {
> > System.out.println("setaddressId" + addressId.intValue());
> > this.addressId = addressId;
> > }
> >
> > }
> >
> > # \d addresses ;
> > Table "public.addresses"
> > Column | Type | Modifiers
> > -----------+-----------------------+-----------
> > addr_id | integer | not null
> > street | character varying(64) | not null
> > placeno | character varying(15) | not null
> > flatno | character varying(5) | not null
> > city | character varying(30) | not null
> > zip | character(6) | not null
> > c_street | character varying(64) |
> > c_placeno | character varying(15) |
> > c_flatno | character varying(5) | not null
> > c_city | character varying(30) |
> > c_zip | character(6) |
> > Indexes: addr_pk primary key btree (addr_id)
> > Check constraints: "check_zip" (zip ~ '^[0-9]{2}-[0-9]{3}$'::text)
> >
> > Log from database
> >
> > with jdbc driver 8.0311
> >
> > enfo_id IN
> > (
> > SELECT enfo_id
> > FROM entry_forms e
> > WHERE not exists (select 1 FROM given_entry_skills ges
> WHERE enfo_id = e.enfo_id) )
> > )
> > --------------------------- HERE -------------------------------
> > 2005-05-01 13:29:52 CEST LOG: statement: INSERT INTO ADDRESSES
> ( ADDR_ID ,STREET ,PLACENO ,FLATNO ,CITY
> ,ZIP ,C_STREET ,C_PLACENO ,C_FLATNO ,C_CITY
> ,C_ZIP ) VALUES( $1 ,$2 ,$3 ,$4
,$5
> ,$6 ,$7 ,$8 ,$9 ,$10 ,$11 )
> > ----------------------------------------------------------
> > 2005-05-01 13:29:52 CEST ERROR: duplicate key violates unique
constraint
> "addr_pk"
> > 2005-05-01 13:29:52 CEST LOG: statement: SELECT * FROM states
> ORDER BY name ASC
> > 2005-05-01 13:29:52 CEST LOG: statement: SELECT * FROM
COMPANIES
> ORDER BY name ASC
> >
> > with jdbc driver 7.4 build 215
> > -------------------------------
> >
> > SELECT enfo_id
> > FROM entry_forms e
> > WHERE not exists (select 1 FROM given_entry_skills ges
> WHERE enfo_id = e.enfo_id) )
> > )
> >
> > 2005-05-01 13:31:17 CEST LOG: statement: set datestyle to 'ISO'; select
> version(), case when pg_encoding_to_char(1) = 'SQL_ASCII' then 'UNKNOWN'
> else getdatabaseencoding() end;
> > 2005-05-01 13:31:17 CEST LOG: duration: 2.466 ms
> > 2005-05-01 13:31:17 CEST LOG: statement: set client_encoding =
'UNICODE'
> > 2005-05-01 13:31:17 CEST LOG: duration: 1.400 ms
> > 2005-05-01 13:31:17 CEST LOG: statement: begin;
> > 2005-05-01 13:31:17 CEST LOG: duration: 0.220 ms
> > 2005-05-01 13:31:17 CEST LOG: statement: rollback; begin;
> > 2005-05-01 13:31:17 CEST LOG: duration: 0.196 ms
> > --------------------------- HERE -------------------------------
> > 2005-05-01 13:31:17 CEST LOG: statement: INSERT INTO ADDRESSES
> ( ADDR_ID ,STREET ,PLACENO ,FLATNO ,CITY
> ,ZIP ,C_STREET ,C_PLACENO ,C_FLATNO ,C_CITY
> ,C_ZIP ) VALUES( 0 ,'7' ,'7' ,'7'
> ,'7' ,'86-300' ,'' ,'' ,'' ,'' ,'' )
> > 2005-05-01 13:31:17 CEST ERROR: duplicate key violates unique
constraint
> "addr_pk"
> > ----------------------------------------------------------
> > 2005-05-01 13:31:17 CEST LOG: statement: rollback; begin;
> > 2005-05-01 13:31:17 CEST LOG: duration: 0.351 ms
> > 2005-05-01 13:31:17 CEST LOG: statement: rollback; begin;
> > 2005-05-01 13:31:17 CEST LOG: duration: 0.225 ms
> > 2005-05-01 13:31:17 CEST LOG: statement: rollback; begin;
> > 2005-05-01 13:31:17 CEST LOG: duration: 0.431 ms
> > 2005-05-01 13:31:17 CEST LOG: statement: SELECT * FROM states
> ORDER BY name ASC
> > 2005-05-01 13:31:17 CEST LOG: duration: 3.400 ms
> > 2005-05-01 13:31:17 CEST LOG: statement: rollback; begin;
> > 2005-05-01 13:31:17 CEST LOG: duration: 0.396 ms
> > 2005-05-01 13:31:17 CEST LOG: statement: rollback; begin;
> > 2005-05-01 13:31:17 CEST LOG: duration: 0.242 ms
> > 2005-05-01 13:31:17 CEST LOG: statement: SELECT * FROM
COMPANIES
> ORDER BY name ASC
> >
> > --------------------------- After removing hidden property addressId
from
> form, it isn't set to 0 ------------------
> > tatement: rollback; begin;
> > 2005-05-01 13:52:24 CEST LOG: duration: 0.485 ms
> > 2005-05-01 13:52:24 CEST LOG: statement: INSERT INTO ADDRESSES
> ( ADDR_ID ,STREET ,PLACENO ,FLATNO ,CITY
> ,ZIP ,C_STREET ,C_PLACENO ,C_FLATNO ,C_CITY
> ,C_ZIP ) VALUES ( null ,'89' ,'89'
,'898'
> ,'9' ,'86-300' ,'' ,'' ,'' ,'' ,'' )
> > 2005-05-01 13:52:24 CEST ERROR: null value in column "addr_id" violates
> not-null constraint
> >
> > In my tomcat logs, I have:
> > --------------------------------
> >
> > DEBUG (CustomerNewActionDAO.java:57) -
> com.protex.persistence.actiondao.CustomerNewActionDAO:insertObject
> > getAddressId:null
> > ERROR (CustomerNewActionDAO.java:81) -
> com.protex.persistence.actiondao.CustomerNewActionDAO.insertObject error
> Failed to update - id [insertCustomerNew] - parameterObject
> [EMAIL PROTECTED] Cause:
> com.ibatis.common.jdbc.exception.NestedSQLException:
> > --- The error occurred in
> com/protex/persistence/sqlmapdao/sql/Customer.xml.
> > --- The error occurred while applying a parameter map.
> > --- Check the insertCustomerNew-InlineParameterMap.
> > --- Check the statement (update failed).
> > --- Cause: org.postgresql.util.PSQLException: ERROR: null value in
column
> "addr_id" violates not-null constraint
> >
> > Caused by: org.postgresql.util.PSQLException: ERROR: null value in
column
> "addr_id" violates not-null constraint
> >
>