I am trying to deploy a CMP 2.0 entity bean with Service Pack 1, which maps
the bean to a SQL Server 2000 table that already exists, where it's primary
key field is an identity.
The table looks like this and was created by the same bean by JRun before I
installed Service Pack 1:
curDate deciaml
platformId int
referer nvarchar
PK transactionId numeric
clientId nvarchar
transType int
sessionId nvarchar
transactionschema$JRunID
I changed the table so that the transactionId Primary Key is an identity
field.
My bean code looks like
package envelope;
import javax.ejb.EJBObject;
import java.rmi.RemoteException;
import java.util.Date;
/**
* <p>Title: Transaction Bean</p>
* <p>Description: Bean to handle TMX e-mail transactions.</p>
* <p>Copyright: Copyright (c) 2002</p>
* <p>Company: TMX Interactive</p>
* @author Bob Jacobs
* @version 1.0
*/
public interface Transaction extends EJBObject {
public long getTransactionId();
public void setTransactionId(long transactionId);
public String getClientId();
public void setClientId(String clientId);
public long getTransType();
public void setTransType(int transType);
public int getPlatformId();
public void setPlatformId(int platformId);
public String getSessionId();
public void setSessionId(String sessionId);
public String getReferer();
public void setReferer(String referer);
public Date getCurDate();
public void setCurDate(Date curDate);
}
***********************************************************************
package envelope;
import javax.ejb.EntityBean;
import javax.ejb.EntityContext;
import javax.ejb.EJBException;
import javax.ejb.CreateException;
import java.rmi.RemoteException;
import javax.ejb.FinderException;
import java.util.Date;
/**
* <h2>Transaction Bean</h2>
* <p>A bean to handle TMX's e-mail transactions.</p>
*/
public abstract class TransactionBean implements EntityBean {
/**
* Bean's entity context.
*/
private EntityContext context;
/**
* Callback method.
*/
public void ejbLoad() throws RemoteException { }
/**
* Callback method.
*/
public void ejbStore() throws RemoteException { }
/**
* Save the EntityContext
*/
public void setEntityContext(EntityContext context) throws RemoteException
{
this.context = context;
}
/**
* Callback method.
*/
public void unsetEntityContext() throws RemoteException, EJBException {
this.context = null;
}
/**
* Callback method.
*/
public void ejbRemove() throws RemoteException { }
/**
* Callback method.
*/
public void ejbActivate() throws RemoteException { }
/**
* Callback method.
*/
public void ejbPassivate() throws RemoteException { }
/*
public java.lang.Long ejbCreate(java.lang.Long transactionId,
String clientId, java.lang.Integer transType,
java.lang.Integer platformId, String sessionId,
String referer, Date curDate)
throws RemoteException, CreateException {
setTransactionId(transactionId.longValue());
setClientId(clientId);
setTransType(transType.intValue());
setPlatformId(platformId.intValue());
setSessionId(sessionId);
setReferer(referer);
setCurDate(curDate);
return null;
}
*/
/**
* <p>Callback method to create an instance (row).
* @param transactionId - Unique id of transaction
* @param clientId - Client's client id
* @param transType - The transaction type id
* @param platformId - The id of the users platform
* @param sessionId - The id of the users session
* @param curDate - The time of the transaction
* <p>This method must match the create method coded in the home
interface.</p>
*/
public java.lang.Long ejbCreate(String clientId, java.lang.Integer
transType,
java.lang.Integer platformId, String sessionId, String referer,
Date curDate)
throws RemoteException, CreateException {
setClientId(clientId);
setTransType(transType.intValue());
setPlatformId(platformId.intValue());
setSessionId(sessionId);
setReferer(referer);
setCurDate(curDate);
return null;
}
/*
public void ejbPostCreate(java.lang.Long transactionId, String clientId,
java.lang.Integer transType,
java.lang.Integer platformId, String sessionId, String referer,
Date curDate) throws RemoteException, CreateException { }
*/
/**
* <p>Required callback method.</p>.
* @param transactionId - Unique id of transaction
* @param clientId - Client's client id
* @param transType - The transaction type id
* @param platformId - The id of the users platform
* @param sessionId - The id of the users session
* @param curDate - The time of the transaction
*/
public void ejbPostCreate(String clientId, java.lang.Integer transType,
java.lang.Integer platformId, String sessionId, String referer,
Date curDate) throws RemoteException, CreateException { }
/**
* CMP field methods
*/
public abstract long getTransactionId();
public abstract void setTransactionId(long transactionId);
public abstract String getClientId();
public abstract void setClientId(String clientId);
public abstract int getTransType();
public abstract void setTransType(int transType);
public abstract int getPlatformId();
public abstract void setPlatformId(int platformId);
public abstract String getSessionId();
public abstract void setSessionId(String sessionId);
public abstract String getReferer();
public abstract void setReferer(String referer);
public abstract Date getCurDate();
public abstract void setCurDate(Date curDate);
}
***************************************************************************
package envelope;
import javax.ejb.EJBHome;
import javax.ejb.CreateException;
import javax.ejb.FinderException;
import java.rmi.RemoteException;
import java.util.Date;
import java.util.Collection;
/**
* <p>Title: Transaction Bean</p>
* <p>Description: Entity Bean Representing a TMX Transaction</p>
* <p>Copyright: Copyright (c) 2002</p>
* <p>Company: TMX Interactive</p>
* @author Bob Jacobs
* @version 1.0
*/
public interface TransactionHome extends EJBHome {
/*
public Transaction create(java.lang.Long transactionId, String clientId,
java.lang.Integer transType, java.lang.Integer platformId,
String sessionId, String referer, Date curDate)
throws RemoteException, CreateException;
*/
public Transaction create(String clientId,
java.lang.Integer transType, java.lang.Integer platformId,
String sessionId, String referer, Date curDate)
throws RemoteException, CreateException;
public Transaction findByPrimaryKey(java.lang.Long transactionId)
throws FinderException, RemoteException;
public Collection findAll()
throws FinderException, RemoteException;
public Collection findElementsBySession(String sessionId)
throws FinderException, RemoteException;
}
***********************************************************************
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise
JavaBeans 2.0//EN" "http://java.sun.com/j2ee/dtds/ejb-jar_2_0.dtd">
<ejb-jar>
<enterprise-beans>
<entity>
<ejb-name>Transaction</ejb-name>
<ejb-class>envelope.TransactionBean</ejb-class>
<home>envelope.TransactionHome</home>
<remote>envelope.Transaction</remote>
<persistence-type>Container</persistence-type>
<prim-key-class>java.lang.Long</prim-key-class>
<reentrant>True</reentrant>
<primkey-field>transactionId</primkey-field>
<abstract-schema-name>transactionschema</abstract-schema-name>
<cmp-version>2.x</cmp-version>
<cmp-field>
<field-name>transactionId</field-name>
</cmp-field>
<cmp-field>
<field-name>clientId</field-name>
</cmp-field>
<cmp-field>
<field-name>transType</field-name>
</cmp-field>
<cmp-field>
<field-name>platformId</field-name>
</cmp-field>
<cmp-field>
<field-name>sessionId</field-name>
</cmp-field>
<cmp-field>
<field-name>referer</field-name>
</cmp-field>
<cmp-field>
<field-name>curDate</field-name>
</cmp-field>
<query>
<query-method>
<method-name>findAll</method-name>
<method-params />
</query-method>
<return-type-mapping>Local</return-type-mapping>
<ejb-ql>SELECT OBJECT(o) FROM
transactionschema AS o</ejb-ql>
</query>
<query>
<query-method>
<method-name>findElementsBySession</method-name>
<method-params>
<method-param>java.lang.String</method-param>
</method-params>
</query-method>
<return-type-mapping>Local</return-type-mapping>
<ejb-ql>SELECT OBJECT(o) FROM
transactionschema AS o WHERE o.sessionId = ?1</ejb-ql>
</query>
</entity>
</enterprise-beans>
</ejb-jar>
****************************************************************************
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jrun-ejb-jar PUBLIC "-//Macromedia, Inc.//DTD jrun-ejb-jar
4.0//EN" "http://jrun.macromedia.com/dtds/jrun-ejb-jar.dtd">
<jrun-ejb-jar>
<source>development</source>
<enterprise-beans>
<entity>
<ejb-name>Transaction</ejb-name>
<jndi-name>Transaction</jndi-name>
<instance-pool>
<maximum-size>5</maximum-size>
<minimum-size>1</minimum-size></instance-pool>
<jdbc-mappings>
<create-table>false</create-table>
<delete-table>false</delete-table>
<!-- <jdbc-mapping>
<statement>
<action>CREATE TABLE "transactionschema" ( "transactionId"
NUMERIC(19,0) , "clientId" NVARCHAR(255) , "transType" INTEGER ,
"platformId" INTEGER , "sessionId" NVARCHAR(255) , "referer" NVARCHAR(255) ,
"curDate" DATETIME )</action></statement>
<name>createTable</name></jdbc-mapping>-->
<jdbc-mapping>
<statement>
<params>
<!-- <param>
<name>transactionId</name>
<type>BIGINT</type></param> -->
<param>
<name>clientId</name>
<type>VARCHAR</type></param>
<param>
<name>transType</name>
<type>INTEGER</type></param>
<param>
<name>platformId</name>
<type>INTEGER</type></param>
<param>
<name>sessionId</name>
<type>VARCHAR</type></param>
<param>
<name>referer</name>
<type>VARCHAR</type></param>
<param>
<name>curDate</name>
<type>DATE</type></param></params>
<action>INSERT INTO "transactionschema" ( "clientId" ,
"transType" , "platformId" , "sessionId" , "referer" , "curDate" ) VALUES (?
, ? , ? , ? , ? , ? )</action></statement>
<name>create</name></jdbc-mapping>
<jdbc-mapping>
<statement>
<params>
<param>
<name>transactionId</name>
<type>BIGINT</type></param></params>
<fields>
<field>transactionId</field>
<field>clientId</field>
<field>transType</field>
<field>platformId</field>
<field>sessionId</field>
<field>referer</field>
<field>curDate</field></fields>
<action>SELECT "transactionId" , "clientId" , "transType" ,
"platformId" , "sessionId" , "referer" , "curDate" FROM "transactionschema"
WHERE "transactionId" = ?</action></statement>
<name>load</name></jdbc-mapping>
<jdbc-mapping>
<statement>
<params>
<param>
<name>transactionId</name>
<type>BIGINT</type></param></params>
<fields>
<field>transactionId</field></fields>
<action>SELECT "transactionId" FROM "transactionschema" WHERE
"transactionId" = ?</action></statement>
<name>findByPrimaryKey</name></jdbc-mapping>
<jdbc-mapping>
<statement>
<params>
<param>
<name>transactionId</name>
<type>BIGINT</type></param>
<param>
<name>clientId</name>
<type>VARCHAR</type></param>
<param>
<name>transType</name>
<type>INTEGER</type></param>
<param>
<name>platformId</name>
<type>INTEGER</type></param>
<param>
<name>sessionId</name>
<type>VARCHAR</type></param>
<param>
<name>referer</name>
<type>VARCHAR</type></param>
<param>
<name>curDate</name>
<type>DATE</type></param>
<param>
<name>transactionId</name>
<type>BIGINT</type></param></params>
<action>UPDATE "transactionschema" SET "transactionId" = ? ,
"clientId" = ? , "transType" = ? , "platformId" = ? , "sessionId" = ? ,
"referer" = ? , "curDate" = ? WHERE "transactionId" = ?</action></statement>
<name>store</name></jdbc-mapping>
<jdbc-mapping>
<statement>
<params>
<param>
<name>transactionId</name>
<type>BIGINT</type></param></params>
<action>DELETE FROM "transactionschema" WHERE "transactionId" =
?</action></statement>
<name>remove</name></jdbc-mapping>
<jdbc-mapping>
<statement>
<action>DROP TABLE "transactionschema"</action></statement>
<name>deleteTable</name></jdbc-mapping>
<jdbc-mapping>
<statement>
<fields>
<field>transactionId</field></fields>
<action>SELECT "o"."transactionId" FROM "transactionschema" "o"
WHERE ("o"."sessionId" = ?1 )</action></statement>
<name>findElementsBySession</name></jdbc-mapping>
<jdbc-mapping>
<statement>
<fields>
<field>transactionId</field></fields>
<action>SELECT "o"."transactionId" FROM "transactionschema"
"o"</action></statement>
<name>findAll</name></jdbc-mapping>
<table-name>transactionschema</table-name>
<object-class>envelope.TransactionBean</object-class>
<primary-key-class>java.lang.Long</primary-key-class></jdbc-mappings>
<always-dirty>false</always-dirty>
<commit-option>B</commit-option>
<multiplexing>true</multiplexing>
<cluster-home>true</cluster-home>
<cluster-object>true</cluster-object>
<cache-size>100</cache-size></entity>
</enterprise-beans>
</jrun-ejb-jar>
**************************************************************************
According to the code and the mapping, when a new bean is created, the
transactionId is not inserted into the database and should be generated by
the database since it is an identity.
However, when I try to create the bean I get the following exception:
javax.ejb.DuplicateKeyException javax.ejb.DuplicateKeyException at
jrunx.persistence.JDBCPersistenceStore.create(JDBCPersistenceStore.java:86)
at
jrun.ejb.persistence.ContainerManagedEntityPersistenceManager.create(Contain
erManagedEntityPersistenceManager.java:77) at
jrun.ejb.EntityContainer.createHome(EntityContainer.java:284) at
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:42
) at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl
java:28) at java.lang.reflect.Method.invoke(Method.java:313) at
jrun.ejb.interceptors.InvokerInterceptor.invokeHomeMethod(InvokerInterceptor
java:101) at
jrun.ejb.interceptors.EntitySynchronizationInterceptor.invokeHomeMethod(Enti
tySynchronizationInterceptor.java:39) at
jrun.ejb.interceptors.EntityInstanceInterceptor.invokeHomeMethod(EntityInsta
nceInterceptor.java:112) at
jrun.ejb.interceptors.ContainerManagedTransactionInterceptor.invokeRequired(
ContainerManagedTransactionInterceptor.java:302) at
jrun.ejb.interceptors.ContainerManagedTransactionInterceptor.invokeTransacte
dMethod(ContainerManagedTransactionInterceptor.java:140) at
jrun.ejb.interceptors.TransactionInterceptor.invokeHomeMethod(TransactionInt
erceptor.java:123) at
jrun.ejb.interceptors.EJBSecurityInterceptor.invokeHomeMethod(EJBSecurityInt
erceptor.java:54) at
jrun.ejb.ClientInvokableContainer.invokeHomeMethod(ClientInvokableContainer.
java:282) at
jrun.ejb.invocation.RemoteInvocationProxyImpl.invoke(RemoteInvocationProxyIm
pl.java:107) at jrunx.rmi.RMIBroker.invokeEJB(RMIBroker.java:233) at
jrunx.rmi.RMIBroker.invoke(RMIBroker.java:140) at
sun.reflect.GeneratedMethodAccessor39.invoke(Unknown Source) at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl
java:28) at java.lang.reflect.Method.invoke(Method.java:313) at
sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:256) at
sun.rmi.transport.Transport$1.run(Transport.java:151) at
java.security.AccessController.doPrivileged(Native Method) at
sun.rmi.transport.Transport.serviceCall(Transport.java:147) at
sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:463) at
sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:7
04) at java.lang.Thread.run(Thread.java:539)
Why am I getting a DuplicateKeyException when the database should just
increment that transactionId field?
Any help would be most appreciated.
Thanks,
Bob
______________________________________________________________________
Your ad could be here. Monies from ads go to support these lists and provide more
resources for the community. http://www.fusionauthority.com/ads.cfm
Archives: http://www.mail-archive.com/[email protected]/
Unsubscribe: http://www.houseoffusion.com/index.cfm?sidebar=lists