The more precise check is if if( ojbFkFields.lenght > refPkValues.lenght ) throw new PersistenceBrokerException("The number of fields in foreign key is greater than the number of fields in primary key (" + realObj.getClass().getName() + ")");
Just m2c, Edson Richter ----- Original Message ----- From: "Edson Carlos Ericksson Richter" <[EMAIL PROTECTED]> To: "OJB Users List" <[EMAIL PROTECTED]> Sent: Wednesday, July 09, 2003 7:47 AM Subject: Re: Help in store function call in PersistenceBroker I had this (exactly) stack trace when I made some reference (foreign key) with two fields mapping for a table that has only one field in primary key. I think OJB must check if fkfields[].length == pkfield[].lenght, and throw a better explanatory exception. The code in PersistenceBrokerImpl should be similar to // MBAIRD: we have 'disassociated' this object from the referenced object, // the object representing the ord is now null, so set the fk to null. if (ref == null) { refPkValues = new Object[objFkFields.length]; } else { // BRJ: ref may be Proxy Class refClass = ProxyHelper.getRealClass(ref); ClassDescriptor refCld = descriptorRepository.getDescriptorFor(refClass); refPkValues = brokerHelper.getKeyValues(refCld, ref, false); } if( ojbFkFields.lenght != refPkValues.lenght ) throw new PersistenceBrokerException("The number of fields in foreign key doesn't match the number of fields in primary key (" + realObj.getClass().getName() + ")"); for (int i = 0; i < objFkFields.length; i++) { objFkFields[i].getPersistentField().set(realObj, refPkValues[i]); } Jakob, Armin, Thomas can someone confirm this? Edson Richter ----- Original Message ----- From: "Chiah Tong Kiat" <[EMAIL PROTECTED]> To: "OJB Users List" <[EMAIL PROTECTED]> Sent: Tuesday, July 08, 2003 11:38 PM Subject: Help in store function call in PersistenceBroker Hi I'm having some problem when I attempt to store the database. It's throwing the stack trace following stack trace com.fedex.cih.jp.JPShipmentImpl.setMDEDetails(JPShipmentImpl.java:424) 2003-07-0 9 02:03:00,843 ERROR [ExecuteThread: '8' for queue: 'default'] jp.JPShipmentImpl (JPShipmentImpl.java:424) - org.apache.ojb.broker.PersistenceBrokerException: C ould not generate primary key values for given Identity com.fedex.data.ShipmentCoreClearanceImpl{2057001}, exception was java.lang.Array IndexOutOfBoundsException java.lang.ArrayIndexOutOfBoundsException at org.apache.ojb.broker.util.BrokerHelper.getKeyValues(BrokerHelper.java:263) at org.apache.ojb.broker.util.BrokerHelper.getKeyValues(BrokerHelper.java:204) at org.apache.ojb.broker.core.PersistenceBrokerImpl.assertFkAssignment(Persiste nceBrokerImpl.java:730) at org.apache.ojb.broker.core.PersistenceBrokerImpl.assignReferenceFKs(Persiste nceBrokerImpl.java:2104) at org.apache.ojb.broker.core.PersistenceBrokerImpl.storeToDb(PersistenceBroker Impl.java:1935) at org.apache.ojb.broker.core.PersistenceBrokerImpl.store(PersistenceBrokerImpl .java:1874) at org.apache.ojb.broker.core.PersistenceBrokerImpl.store(PersistenceBrokerImpl .java:660) at org.apache.ojb.broker.core.DelegatingPersistenceBroker.store(DelegatingPersi stenceBroker.java:158) at com.fedex.cih.jp.JPShipmentImpl.setMDEDetails(JPShipmentImpl.java:370) at com.fedex.cih.ejb.ShipmentBean.setMDEDetails(ShipmentBean.java:159) at com.fedex.cih.ejb.ShipmentBean_6ssy2e_EOImpl.setMDEDetails(ShipmentBean_6ssy 2e_EOImpl.java:202) at com.fedex.cih.ejb.ShipmentBean_6ssy2e_EOImpl_WLSkel.invoke(Unknown Source) at weblogic.rmi.internal.BasicServerRef.invoke(BasicServerRef.java:362) at weblogic.rmi.internal.BasicServerRef$1.run(BasicServerRef.java:313) at weblogic.security.service.SecurityServiceManager.runAs(SecurityServiceManage r.java:821) at weblogic.rmi.internal.BasicServerRef.handleRequest(BasicServerRef.java:308) at weblogic.rmi.internal.BasicExecuteRequest.execute(BasicExecuteRequest.java:3 0) at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:213) at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:189) rethrown as org.apache.ojb.broker.PersistenceBrokerException: Could not generate primary key values for given Identity com.fedex.data.ShipmentCoreClearanceImpl{2057001}, exception was java.lang.ArrayIndexOutOfBoundsException at org.apache.ojb.broker.util.BrokerHelper.getKeyValues(BrokerHelper.java:275) at org.apache.ojb.broker.util.BrokerHelper.getKeyValues(BrokerHelper.java:204) at org.apache.ojb.broker.core.PersistenceBrokerImpl.assertFkAssignment(Persiste nceBrokerImpl.java:730) at org.apache.ojb.broker.core.PersistenceBrokerImpl.assignReferenceFKs(Persiste nceBrokerImpl.java:2104) at org.apache.ojb.broker.core.PersistenceBrokerImpl.storeToDb(PersistenceBroker Impl.java:1935) at org.apache.ojb.broker.core.PersistenceBrokerImpl.store(PersistenceBrokerImpl .java:1874) at org.apache.ojb.broker.core.PersistenceBrokerImpl.store(PersistenceBrokerImpl .java:660) at org.apache.ojb.broker.core.DelegatingPersistenceBroker.store(DelegatingPersi stenceBroker.java:158) at com.fedex.cih.jp.JPShipmentImpl.setMDEDetails(JPShipmentImpl.java:370) at com.fedex.cih.ejb.ShipmentBean.setMDEDetails(ShipmentBean.java:159) at com.fedex.cih.ejb.ShipmentBean_6ssy2e_EOImpl.setMDEDetails(ShipmentBean_6ssy 2e_EOImpl.java:202) at com.fedex.cih.ejb.ShipmentBean_6ssy2e_EOImpl_WLSkel.invoke(Unknown Source) at weblogic.rmi.internal.BasicServerRef.invoke(BasicServerRef.java:362) at weblogic.rmi.internal.BasicServerRef$1.run(BasicServerRef.java:313) at weblogic.security.service.SecurityServiceManager.runAs(SecurityServiceManage r.java:821) at weblogic.rmi.internal.BasicServerRef.handleRequest(BasicServerRef.java:308) at weblogic.rmi.internal.BasicExecuteRequest.execute(BasicExecuteRequest.java:3 0) at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:213) at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:189) com.fedex.cih.jp.JPShipmentImpl.setMDEDetails(JPShipmentImpl.java:446) 2003-07-0 9 02:03:01,187 DEBUG [ExecuteThread: '8' for queue: 'default'] jp.JPShipmentImpl (JPShipmentImpl.java:446) - Closing broker in finally setMDEDetails() : TX The problem happen when at the BrokerHelp Where the class descriptor class is return 2 primary key And the identity class return only contains one (which is correct since at the reference mapping I'm only setting only one) ---------------------------------------------------------------------------- ---- --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] --- Outgoing mail is certified Virus Free. Checked by AVG anti-virus system (http://www.grisoft.com). Version: 6.0.497 / Virus Database: 296 - Release Date: 4/7/2003 --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]