[jboss-user] [Beginners Corner] - problem getting back the identity of a created row
RCQ
do-not-reply at jboss.com
Fri May 11 08:23:41 EDT 2007
hi all,
i have to migrate an application from postgres to mssqlserver2005.
it went quite well, until so far, but now i'm blocked for a while.
When user enter my application, a row is written to a table "Sessions(id int, user int, startTime datetime)".
(the id is auto-generated by the database).
I see the row is correctly written in the database, but when i want to retrieve the id that the database generated,
the application crashes:
anonymous wrote :
| 2007-05-11 13:57:33,516 ERROR [org.jboss.ejb.plugins.LogInterceptor] RuntimeException:
| java.lang.ClassCastException
| at be.xxxx.xxx.xxx.bean.SessionBean$Proxy.getId()
| at be.xxxx.xxx.xxx.bean.SessionBean.getSessionValue(SessionBean.java:120)
| at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
| at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
| at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
| at java.lang.reflect.Method.invoke(Method.java:324)
| at org.jboss.ejb.EntityContainer$ContainerInterceptor.invoke(EntityContainer.java:1044)
| at org.jboss.ejb.plugins.cmp.jdbc.JDBCRelationInterceptor.invoke(JDBCRelationInterceptor.java:95)
| at org.jboss.ejb.plugins.EntitySynchronizationInterceptor.invoke(EntitySynchronizationInterceptor.java:301)
| at org.jboss.resource.connectionmanager.CachedConnectionInterceptor.invoke(CachedConnectionInterceptor.java:186)
| at org.jboss.ejb.plugins.EntityReentranceInterceptor.invoke(EntityReentranceInterceptor.java:82)
| at org.jboss.ejb.plugins.EntityInstanceInterceptor.invoke(EntityInstanceInterceptor.java:174)
| at org.jboss.ejb.plugins.EntityLockInterceptor.invoke(EntityLockInterceptor.java:89)
| at org.jboss.ejb.plugins.EntityCreationInterceptor.invoke(EntityCreationInterceptor.java:53)
| at org.jboss.ejb.plugins.AbstractTxInterceptor.invokeNext(AbstractTxInterceptor.java:84)
| at org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions(TxInterceptorCMT.java:243)
| at org.jboss.ejb.plugins.TxInterceptorCMT.invoke(TxInterceptorCMT.java:104)
| at org.jboss.ejb.plugins.SecurityInterceptor.invoke(SecurityInterceptor.java:117)
| at org.jboss.ejb.plugins.LogInterceptor.invoke(LogInterceptor.java:191)
| at org.jboss.ejb.plugins.ProxyFactoryFinderInterceptor.invoke(ProxyFactoryFinderInterceptor.java:122)
| at org.jboss.ejb.EntityContainer.internalInvoke(EntityContainer.java:483)
| at org.jboss.ejb.Container.invoke(Container.java:674)
| at org.jboss.ejb.plugins.local.BaseLocalProxyFactory.invoke(BaseLocalProxyFactory.java:353)
| at org.jboss.ejb.plugins.local.EntityProxy.invoke(EntityProxy.java:38)
| at $Proxy220.getSessionValue(Unknown Source)
|
However, I think I changed everything correctly:
standardjbosscmp-jdbc.xml wrote :
| <jbosscmp-jdbc>
|
|
|
|
|
| java:/MSSQLDS
|
| <datasource-mapping>MSSQL</datasource-mapping>
|
|
|
| <create-table>true</create-table>
|
| <remove-table>false</remove-table>
|
| <read-only>false</read-only>
|
| <time-out>300</time-out>
|
| <pk-constraint>true</pk-constraint>
|
| <fk-constraint>false</fk-constraint>
|
| <row-locking>false</row-locking>
|
| <preferred-relation-mapping>foreign-key</preferred-relation-mapping>
|
| <read-ahead>
|
| on-load
|
| <page-size>1000</page-size>
|
| <eager-load-group>*</eager-load-group>
|
| </read-ahead>
|
| <list-cache-max>1000</list-cache-max>
|
|
|
| <unknown-pk>
|
| <key-generator-factory>UUIDKeyGeneratorFactory</key-generator-factory>
|
| <unknown-pk-class>java.lang.String</unknown-pk-class>
|
| <jdbc-type>VARCHAR</jdbc-type>
|
| <sql-type>VARCHAR(32)</sql-type>
|
| </unknown-pk>
|
|
|
| <entity-command name="default"/>
|
|
|
|
|
|
|
| <type-mapping>
|
| MSSQL
|
| <row-locking-template>SELECT ?1 FROM ?2 with (rowlock) WHERE ?3</row-locking-template>
|
| <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
|
| <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
| <auto-increment-template>?1 IDENTITY</auto-increment-template>
|
| <alias-header-prefix>t</alias-header-prefix>
|
| <alias-header-suffix>_</alias-header-suffix>
|
| <alias-max-length>32</alias-max-length>
|
| <subquery-supported>true</subquery-supported>
|
| <true-mapping>1</true-mapping>
|
| <false-mapping>0</false-mapping>
|
|
|
| <function-mapping>
|
| <function-name>concat</function-name>
|
| <function-sql>(?1 + ?2)</function-sql>
|
| </function-mapping>
|
| <function-mapping>
|
| <function-name>substring</function-name>
|
| <function-sql>substring(?1, ?2, ?3)</function-sql>
|
| </function-mapping>
|
| <function-mapping>
|
| <function-name>lcase</function-name>
|
| <function-sql>lower(?1)</function-sql>
|
| </function-mapping>
|
| <function-mapping>
|
| <function-name>length</function-name>
|
| <function-sql>len(?1)</function-sql>
|
| </function-mapping>
|
| <function-mapping>
|
| <function-name>locate</function-name>
|
| <function-sql>charindex(?1, ?2, ?3)</function-sql>
|
| </function-mapping>
|
| <function-mapping>
|
| <function-name>abs</function-name>
|
| <function-sql>abs(?1)</function-sql>
|
| </function-mapping>
|
| <function-mapping>
|
| <function-name>sqrt</function-name>
|
| <function-sql>sqrt(?1)</function-sql>
|
| </function-mapping>
|
| <function-mapping>
|
| <function-name>ucase</function-name>
|
| <function-sql>upper(?1)</function-sql>
|
| </function-mapping>
|
|
|
|
|
| <java-type>java.lang.Integer</java-type>
|
| <jdbc-type>INTEGER</jdbc-type>
|
| <sql-type>INT</sql-type>
|
|
|
|
|
|
|
| <java-type>java.lang.Character</java-type>
|
| <jdbc-type>CHAR</jdbc-type>
|
| <sql-type>CHAR</sql-type>
|
|
|
|
|
|
|
| <java-type>java.lang.Short</java-type>
|
| <jdbc-type>SMALLINT</jdbc-type>
|
| <sql-type>SMALLINT</sql-type>
|
|
|
|
|
|
|
| <java-type>java.lang.Long</java-type>
|
| <jdbc-type>BIGINT</jdbc-type>
|
| <sql-type>BIGINT</sql-type>
|
|
|
|
|
|
|
| <java-type>java.math.BigDecimal</java-type>
|
| <jdbc-type>VARCHAR</jdbc-type>
|
| <sql-type>VARCHAR(256)</sql-type>
|
|
|
|
|
|
|
| <java-type>java.lang.String</java-type>
|
| <jdbc-type>VARCHAR</jdbc-type>
|
| <sql-type>VARCHAR(256)</sql-type>
|
|
|
|
|
|
|
| <java-type>java.lang.Object</java-type>
|
| <jdbc-type>LONGVARBINARY</jdbc-type>
|
| <sql-type>IMAGE</sql-type>
|
|
|
|
|
|
|
| <java-type>java.lang.Byte</java-type>
|
| <jdbc-type>TINYINT</jdbc-type>
|
| <sql-type>TINYINT</sql-type>
|
|
|
|
|
|
|
| <!--
|
| | Note that you lose granularity here
|
| | Use a numeric type and store milliseconds if you really need it
|
| -->
|
| <java-type>java.sql.Timestamp</java-type>
|
| <jdbc-type>TIMESTAMP</jdbc-type>
|
| <sql-type>DATETIME</sql-type>
|
|
|
|
|
|
|
| <java-type>java.sql.Date</java-type>
|
| <jdbc-type>DATE</jdbc-type>
|
| <sql-type>DATETIME</sql-type>
|
|
|
|
|
|
|
| <java-type>java.sql.Time</java-type>
|
| <jdbc-type>TIME</jdbc-type>
|
| <sql-type>DATETIME</sql-type>
|
|
|
|
|
|
|
| <java-type>java.util.Date</java-type>
|
| <jdbc-type>TIMESTAMP</jdbc-type>
|
| <sql-type>DATETIME</sql-type>
|
|
|
|
|
|
|
| <java-type>java.lang.Boolean</java-type>
|
| <jdbc-type>BIT</jdbc-type>
|
| <sql-type>BIT</sql-type>
|
|
|
|
|
|
|
| <java-type>java.lang.Float</java-type>
|
| <jdbc-type>REAL</jdbc-type>
|
| <sql-type>REAL</sql-type>
|
|
|
|
|
|
|
| <java-type>java.lang.Double</java-type>
|
| <jdbc-type>DOUBLE</jdbc-type>
|
| <sql-type>FLOAT</sql-type>
|
|
|
| </type-mapping>
|
| <entity-commands>
|
| <!-- default command; doesn't support unknown-pk -->
|
| <entity-command name="default"
|
| class="org.jboss.ejb.plugins.cmp.jdbc.JDBCCreateEntityCommand"/>
|
|
|
| <!-- variation on default that skips select before insert -->
|
| <entity-command name="no-select-before-insert"
|
| class="org.jboss.ejb.plugins.cmp.jdbc.JDBCCreateEntityCommand">
|
| jboss.jdbc:service=SQLExceptionProcessor
|
| </entity-command>
|
|
|
| <!-- fetches next key value with the specified sql statement -->
|
| <entity-command name="pk-sql"
|
| class="org.jboss.ejb.plugins.cmp.jdbc.JDBCPkSqlCreateCommand">
|
| SELECT SCOPE_IDENTITY()
|
| </entity-command>
|
|
| <!-- this command requires auto-increment element for unknown-pk -->
|
| <entity-command name="mysql-get-generated-keys"
|
| class="org.jboss.ejb.plugins.cmp.jdbc.mysql.JDBCMySQLCreateCommand"/>
|
|
|
| <!-- retrieves generated key of the record inserted into hsql db -->
|
| <entity-command name="hsqldb-fetch-key"
|
| class="org.jboss.ejb.plugins.cmp.jdbc.hsqldb.JDBCHsqldbCreateCommand"/>
|
|
|
| <!-- retrieves generated key of the record inserted into sybase db -->
|
| <entity-command name="sybase-fetch-key"
|
| class="org.jboss.ejb.plugins.cmp.jdbc.sybase.JDBCSybaseCreateCommand"/>
|
|
|
| <!-- retrieves serial value of the record inserted into informix db -->
|
| <entity-command name="informix-serial"
|
| class="org.jboss.ejb.plugins.cmp.jdbc.informix.JDBCInformixCreateCommand"/>
|
|
|
| <!-- uses key generator to fetch the next key value -->
|
| <entity-command name="key-generator"
|
| class="org.jboss.ejb.plugins.cmp.jdbc.JDBCKeyGeneratorCreateCommand">
|
| UUIDKeyGeneratorFactory
|
| </entity-command>
|
|
| <!-- to auto-increment primary-keys -->
|
| <entity-command name="postgresql-fetch-seq"
|
| class="org.jboss.ejb.plugins.cmp.jdbc.postgres.JDBCPostgresCreateCommand"/>
|
| <entity-command
| name="get-generated-keys" class="org.jboss.ejb.plugins.cmp.jdbc.jdbc3.JDBCGetGeneratedKeysCreateCommand" />
| <!-- JDK1.4
|
| <entity-command name="get-generated-keys"
|
| class="org.jboss.ejb.plugins.cmp.jdbc.jdbc3.JDBCGetGeneratedKeysCreateCommand"/>
|
| -->
|
| </entity-commands>
|
|
standardjaws.xml wrote :
|
|
| java:/MSSQLDS
| <type-mapping>MSSQL</type-mapping>
| false
|
| <default-entity>
| <create-table>true</create-table>
| <remove-table>false</remove-table>
| <tuned-updates>true</tuned-updates>
| <read-only>false</read-only>
| <time-out>300</time-out>
| <row-locking>false</row-locking>
| <read-ahead>false</read-ahead>
| </default-entity>
|
|
| <type-mapping-definition>
| MSSQL
|
|
| <java-type>java.lang.Integer</java-type>
| <jdbc-type>INTEGER</jdbc-type>
| <sql-type>INT</sql-type>
|
|
|
| <java-type>java.lang.Character</java-type>
| <jdbc-type>CHAR</jdbc-type>
| <sql-type>CHAR</sql-type>
|
|
|
| <java-type>java.lang.Short</java-type>
| <jdbc-type>SMALLINT</jdbc-type>
| <sql-type>SMALLINT</sql-type>
|
|
|
| <java-type>java.lang.Long</java-type>
| <jdbc-type>BIGINT</jdbc-type>
| <sql-type>BIGINT</sql-type>
|
|
|
| <java-type>java.math.BigDecimal</java-type>
| <jdbc-type>VARCHAR</jdbc-type>
| <sql-type>VARCHAR(256)</sql-type>
|
|
|
| <java-type>java.lang.String</java-type>
| <jdbc-type>VARCHAR</jdbc-type>
| <sql-type>VARCHAR(256)</sql-type>
|
|
|
| <java-type>java.lang.Object</java-type>
| <jdbc-type>JAVA_OBJECT</jdbc-type>
| <sql-type>IMAGE</sql-type>
|
|
|
| <java-type>java.lang.Byte</java-type>
| <jdbc-type>TINYINT</jdbc-type>
| <sql-type>TINYINT</sql-type>
|
|
|
| <java-type>java.sql.Timestamp</java-type>
| <jdbc-type>TIMESTAMP</jdbc-type>
| <sql-type>TIMESTAMP</sql-type>
|
|
|
| <java-type>java.sql.Date</java-type>
| <jdbc-type>DATE</jdbc-type>
| <sql-type>DATETIME</sql-type>
|
|
|
| <java-type>java.sql.Time</java-type>
| <jdbc-type>TIME</jdbc-type>
| <sql-type>DATETIME</sql-type>
|
|
|
| <java-type>java.util.Date</java-type>
| <jdbc-type>DATE</jdbc-type>
| <sql-type>DATETIME</sql-type>
|
|
|
| <java-type>java.lang.Boolean</java-type>
| <jdbc-type>BIT</jdbc-type>
| <sql-type>BIT</sql-type>
|
|
|
| <java-type>java.lang.Float</java-type>
| <jdbc-type>REAL</jdbc-type>
| <sql-type>REAL</sql-type>
|
|
|
| <java-type>java.lang.Double</java-type>
| <jdbc-type>DOUBLE</jdbc-type>
| <sql-type>FLOAT</sql-type>
|
| </type-mapping-definition>
|
|
this is in my bean wrote :
| /**
| * Entity bean die een sessie beschrijft.
| *
| * @ejb.bean
| * name="Session"
| * view-type="local"
| * local-jndi-name="LocalSessionEJB"
| * type="CMP"
| * cmp-version="2.x"
| * primkey-field="id"
| *
| * @ejb.transaction type="required"
| *
| * @ejb.persistence table-name="sessions"
| * @ejb.pk class="java.lang.Integer"
| *
| * @ejb.permission role-name="system"
| * @ejb.security-identity run-as="system"
| *
| * @ejb.value-object
| * @ejb.util generate="physical"
| *
| * @jboss.entity-command
| * name="get-generated-keys"
| *
| * @jboss.method-attributes pattern="get*" read-only="true"
| *
| */
|
| public Integer ejbCreate....
| public void ejbPostCreate...
|
| /**
| * id of the sessie.
| * @ejb.interface-method view-type="local"
| * @ejb.persistence
| * @jboss.persistence auto-increment="true"
| */
| public abstract Integer getId();
|
| /**
| * @ejb.interface-method view-type="local"
| */
| public abstract void setId(Integer id);
|
| public be.xxxx.xxxx.data.bean.SessionValue getSessionValue() {
| System.out.println("before Sessionvalue");
| SessionValue sessionValue
| = new be.tinc.bkw.data.bean.SessionValue();
| System.out.println("after Sessionvalue");
| UserLocal userLocal;
| System.out.println("getting the user");
| //added for debuggin
| System.out.println("user "+getUser());
| System.out.println("startTime "+getStartTime());
| System.out.println("endTime "+getEndTime());
| System.out.println("after getting the user");
| System.out.println("getting the id");
| //HERE IT CRASHES !!!!!!!!!!!!!!!!!!!
| System.out.println("the id is: "+getId());
| System.out.println("after getting the id");
| sessionValue.setId(getId());
| userLocal = getUser();
| if (null != userLocal) {
| sessionValue.setUser(userLocal.getUserValue());
| }
| sessionValue.setStartTime(getStartTime());
| if (getEndTime() != null){
| sessionValue.setEndTime(getEndTime());
| }
| return sessionValue;
| }
|
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4044961#4044961
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4044961
More information about the jboss-user
mailing list